litmus_paper 0.3.5 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/bin/litmusctl CHANGED
@@ -3,5 +3,9 @@
3
3
  require 'optparse'
4
4
  require 'litmus_paper'
5
5
  require 'litmus_paper/cli/admin'
6
+ require 'litmus_paper/cli/admin/command'
7
+ require 'litmus_paper/cli/admin/list'
8
+ require 'litmus_paper/cli/admin/force'
9
+ require 'litmus_paper/cli/admin/status'
6
10
 
7
11
  LitmusPaper::CLI::Admin.new.run
@@ -1,63 +1,83 @@
1
1
  module LitmusPaper
2
2
  class App < Sinatra::Base
3
3
  get "/" do
4
- output = "Litmus Paper #{LitmusPaper::VERSION}\n"
4
+ output = "Litmus Paper #{LitmusPaper::VERSION}\n\n"
5
5
  output += "Services monitored:\n"
6
- output += LitmusPaper.services.keys.join("\n")
6
+ LitmusPaper.services.each do |service_name, service|
7
+ output += "* #{service_name} (#{service.current_health.value})\n"
8
+ end
7
9
 
8
- text 200, output
10
+ _text 200, output
9
11
  end
10
12
 
11
- post "/force/*" do
12
- path = *status_file_path(params[:splat])
13
- statusfile = StatusFile.new(*path)
14
- statusfile.create(params[:reason])
13
+ delete "/down" do
14
+ _delete_status_file(StatusFile.global_down_file)
15
+ end
15
16
 
16
- text 201, "File created"
17
+ post "/down" do
18
+ _create_status_file(StatusFile.global_down_file)
17
19
  end
18
20
 
19
- delete "/force/*" do
20
- path = *status_file_path(params[:splat])
21
- statusfile = StatusFile.new(*path)
22
- if statusfile.exists?
23
- statusfile.delete
24
- text 200, "File deleted"
25
- else
26
- text 404, "NOT FOUND"
27
- end
21
+ delete "/up" do
22
+ _delete_status_file(StatusFile.global_up_file)
23
+ end
24
+
25
+ post "/up" do
26
+ _create_status_file(StatusFile.global_up_file)
28
27
  end
29
28
 
30
29
  get "/:service/status" do
31
30
  health = LitmusPaper.check_service(params[:service])
32
31
  if health.nil?
33
- text 404, "NOT FOUND", { "X-Health" => "0" }
32
+ _text 404, "NOT FOUND", { "X-Health" => "0" }
34
33
  else
35
34
  response_code = health.ok? ? 200 : 503
36
35
  body = "Health: #{health.value}\n"
37
36
  body << health.summary
38
- text response_code, body, { "X-Health" => health.value.to_s }
37
+ _text response_code, body, { "X-Health" => health.value.to_s }
39
38
  end
40
39
  end
41
40
 
41
+ delete "/:service/down" do
42
+ _delete_status_file(StatusFile.service_down_file(params[:service]))
43
+ end
44
+
45
+ post "/:service/down" do
46
+ _create_status_file(StatusFile.service_down_file(params[:service]))
47
+ end
48
+
49
+ delete "/:service/up" do
50
+ _delete_status_file(StatusFile.service_up_file(params[:service]))
51
+ end
52
+
53
+ post "/:service/up" do
54
+ _create_status_file(StatusFile.service_up_file(params[:service]))
55
+ end
56
+
42
57
  get "/test/error" do
43
58
  raise "an error"
44
59
  end
45
60
 
46
61
  error do
47
- text 500, "Server Error"
62
+ _text 500, "Server Error"
48
63
  end
49
64
 
50
- def text(response_code, body, headers ={})
51
- [response_code, { "Content-Type" => "text/plain" }.merge(headers), body]
65
+ def _create_status_file(status_file)
66
+ status_file.create(params[:reason])
67
+ _text 201, "File created"
52
68
  end
53
69
 
54
- def status_file_path(splat)
55
- path = splat.first.split("/")
56
- if path.size == 1
57
- ["global_#{path.first}"]
70
+ def _delete_status_file(status_file)
71
+ if status_file.exists?
72
+ status_file.delete
73
+ _text 200, "File deleted"
58
74
  else
59
- path
75
+ _text 404, "NOT FOUND"
60
76
  end
61
77
  end
78
+
79
+ def _text(response_code, body, headers ={})
80
+ [response_code, { "Content-Type" => "text/plain" }.merge(headers), body]
81
+ end
62
82
  end
63
83
  end
@@ -0,0 +1,25 @@
1
+ module LitmusPaper
2
+ module CLI
3
+ class Admin
4
+ class Command
5
+ def self._default_options
6
+ options = { :port => 9292, :host => 'localhost' }
7
+ end
8
+
9
+ def self._extend_default_parser(options, &block)
10
+ OptionParser.new do |opts|
11
+ block.call(opts)
12
+
13
+ opts.on("-p", "--port=port", Integer, "Port litmus is running on", "Default: 9292") do |port|
14
+ options[:port] = port
15
+ end
16
+ opts.on("-h", "--host=ip", String, ":Host litmus is running on", "Default: localhost") do |host|
17
+ options[:host] = host
18
+ end
19
+ opts.on("--help", "Show this help message.") { puts opts; exit }
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,41 @@
1
+ module LitmusPaper
2
+ module CLI
3
+ class Admin
4
+ class Force < Command
5
+ def self.description
6
+ "Force services up or down"
7
+ end
8
+
9
+ def self.build_request(options, args)
10
+ options.merge! _default_options
11
+ opt_parser = _extend_default_parser(options) do |opts|
12
+ opts.banner = "Usage: litmusctl force <up|down> [service] [options]"
13
+ opts.on("-d", "--delete", "Remove status file") do
14
+ options[:delete] = true
15
+ end
16
+ opts.on("-r", "--reason=reason", String, "Reason for status file") do |reason|
17
+ options[:reason] = reason
18
+ end
19
+ end
20
+
21
+ opt_parser.parse! args
22
+ direction, service = args
23
+ path = service ? "/#{service}/#{direction}" : "/#{direction}"
24
+
25
+ if options[:delete]
26
+ request = Net::HTTP::Delete.new(path)
27
+ else
28
+ if !options.has_key?(:reason)
29
+ print "Reason? "
30
+ options[:reason] = STDIN.gets.chomp
31
+ end
32
+ request = Net::HTTP::Post.new(path)
33
+ request.set_form_data('reason' => options[:reason])
34
+ end
35
+
36
+ request
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,21 @@
1
+ module LitmusPaper
2
+ module CLI
3
+ class Admin
4
+ class List < Command
5
+ def self.description
6
+ "List services"
7
+ end
8
+
9
+ def self.build_request(options, args)
10
+ options.merge! _default_options
11
+ opt_parser = _extend_default_parser(options) do |opts|
12
+ opts.banner = "Usage: litmusctl list [options]"
13
+ end
14
+ opt_parser.parse! args
15
+
16
+ Net::HTTP::Get.new("/")
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,23 @@
1
+ module LitmusPaper
2
+ module CLI
3
+ class Admin
4
+ class Status < Command
5
+ def self.description
6
+ "Show service status"
7
+ end
8
+
9
+ def self.build_request(options, args)
10
+ options.merge! _default_options
11
+ opt_parser = _extend_default_parser(options) do |opts|
12
+ opts.banner = "Usage: litmusctl status <service> [options]"
13
+ end
14
+
15
+ opt_parser.parse! args
16
+ service = args.shift
17
+
18
+ Net::HTTP::Get.new("/#{service}/status")
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,79 +1,33 @@
1
1
  module LitmusPaper
2
2
  module CLI
3
3
  class Admin
4
- def run(argv = ARGV)
5
- command = argv.shift
6
- send(command, argv)
7
- end
8
-
9
- def list(args)
10
- options = _default_options
11
- opt_parser = _extend_default_parser(options) do |opts|
12
- opts.banner = "Usage: litmusctl list [options]"
13
- end
14
- opt_parser.parse! args
15
-
16
- request = Net::HTTP::Get.new("/")
17
- _litmus_request(options[:host], options[:port], request)
4
+ def self.commands
5
+ {
6
+ "list" => LitmusPaper::CLI::Admin::List,
7
+ "force" => LitmusPaper::CLI::Admin::Force,
8
+ "status" => LitmusPaper::CLI::Admin::Status
9
+ }
18
10
  end
19
11
 
20
- def force(args)
21
- options = _default_options
22
- opt_parser = _extend_default_parser(options) do |opts|
23
- opts.banner = "Usage: litmusctl force <up|down> [service] [options]"
24
- opts.on("-d", "--delete", "Remove status file") do
25
- options[:delete] = true
26
- end
27
- opts.on("-r", "--reason=reason", String, "Reason for status file") do |reason|
28
- options[:reason] = reason
29
- end
30
- end
31
-
32
- opt_parser.parse! args
33
- direction, service = args
12
+ def run(argv = ARGV)
13
+ command_name = argv.shift
34
14
 
35
- if options[:delete]
36
- request = Net::HTTP::Delete.new("/force/#{direction}/#{service}")
15
+ if command = Admin.commands[command_name]
16
+ options = {}
17
+ request = command.build_request(options, argv)
18
+ _litmus_request(options[:host], options[:port], request)
37
19
  else
38
- if !options.has_key?(:reason)
39
- print "Reason? "
40
- options[:reason] = gets.chomp
41
- end
42
- request = Net::HTTP::Post.new("/force/#{direction}/#{service}")
43
- request.set_form_data('reason' => options[:reason])
20
+ _display_help
44
21
  end
45
-
46
- _litmus_request(options[:host], options[:port], request)
47
- end
48
-
49
- def status(args)
50
- options = _default_options
51
- opt_parser = _extend_default_parser(options) do |opts|
52
- opts.banner = "Usage: litmusctl status <service> [options]"
53
- end
54
-
55
- opt_parser.parse! args
56
- service = args.shift
57
-
58
- _litmus_request(options[:host], options[:port], Net::HTTP::Get.new("/#{service}/status"))
59
22
  end
60
23
 
61
- def _default_options
62
- options = { :port => 9292, :host => 'localhost' }
63
- end
64
-
65
- def _extend_default_parser(options, &block)
66
- OptionParser.new do |opts|
67
- block.call(opts)
68
-
69
- opts.on("-p", "--port=port", Integer, "Port litmus is running on", "Default: 9292") do |port|
70
- options[:port] = port
71
- end
72
- opts.on("-h", "--host=ip", String, ":Host litmus is running on", "Default: localhost") do |host|
73
- options[:host] = host
74
- end
75
- opts.on("--help", "Show this help message.") { puts opts; exit }
24
+ def _display_help
25
+ puts "Litmus Paper CLI v#{LitmusPaper::VERSION}\n\n"
26
+ puts "Commands:\n"
27
+ Admin.commands.keys.sort.each do |name|
28
+ puts " %-8s %s" % [name, Admin.commands[name].description]
76
29
  end
30
+ puts "\nSee 'litmusctl <command> --help' for more information on a specific command"
77
31
  end
78
32
 
79
33
  def _litmus_request(host, port, request)
@@ -30,17 +30,12 @@ module LitmusPaper
30
30
  end
31
31
 
32
32
  def _health_files
33
- @health_files ||= [
34
- [0, LitmusPaper::StatusFile.new('down', @name)],
35
- [100, LitmusPaper::StatusFile.new('up', @name)],
36
- [0, LitmusPaper::StatusFile.new('global_down')],
37
- [100, LitmusPaper::StatusFile.new('global_up')]
38
- ]
33
+ StatusFile.priority_check_order_for_service(@name)
39
34
  end
40
35
 
41
36
  def _determine_forced_health
42
- _health_files.map do |health, status_file|
43
- ForcedHealth.new(health, status_file.content) if status_file.exists?
37
+ _health_files.map do |status_file|
38
+ ForcedHealth.new(status_file.health, status_file.content) if status_file.exists?
44
39
  end.compact.first
45
40
  end
46
41
  end
@@ -1,7 +1,35 @@
1
1
  module LitmusPaper
2
2
  class StatusFile
3
- def initialize(*filenames)
4
- @path = File.join(LitmusPaper.config_dir, *filenames)
3
+ attr_reader :health
4
+
5
+ def self.global_down_file
6
+ new("global_down", 0)
7
+ end
8
+
9
+ def self.global_up_file
10
+ new("global_up", 100)
11
+ end
12
+
13
+ def self.service_down_file(service_name)
14
+ new("#{service_name}_down", 0)
15
+ end
16
+
17
+ def self.service_up_file(service_name)
18
+ new("#{service_name}_up", 100)
19
+ end
20
+
21
+ def self.priority_check_order_for_service(service_name)
22
+ [
23
+ global_down_file,
24
+ global_up_file,
25
+ service_down_file(service_name),
26
+ service_up_file(service_name)
27
+ ]
28
+ end
29
+
30
+ def initialize(filename, health)
31
+ @path = File.join(LitmusPaper.config_dir, filename)
32
+ @health = health
5
33
  end
6
34
 
7
35
  def content
@@ -1,3 +1,3 @@
1
1
  module LitmusPaper
2
- VERSION = "0.3.5"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -23,38 +23,52 @@ describe LitmusPaper::App do
23
23
  last_response.status.should == 200
24
24
  last_response.body.should include("Litmus Paper #{LitmusPaper::VERSION}")
25
25
  end
26
+
27
+ it "includes the health of the service" do
28
+ LitmusPaper.services['test'] = LitmusPaper::Service.new('test')
29
+ LitmusPaper.services['another'] = LitmusPaper::Service.new('another')
30
+
31
+ get "/"
32
+
33
+ last_response.status.should == 200
34
+ last_response.body.should include("* test (0)\n")
35
+ end
26
36
  end
27
37
 
28
- describe "POST /force/*" do
38
+ describe "POST /up" do
29
39
  it "creates a global upfile" do
30
40
  test_service = LitmusPaper::Service.new('test', [NeverAvailableDependency.new], [ConstantMetric.new(100)])
31
41
  LitmusPaper.services['test'] = test_service
32
42
 
33
- post "/force/up", :reason => "up for testing"
43
+ post "/up", :reason => "up for testing"
34
44
  last_response.status.should == 201
35
45
 
36
46
  get "/test/status"
37
47
  last_response.status.should == 200
38
48
  last_response.body.should match(/up for testing/)
39
49
  end
50
+ end
40
51
 
52
+ describe "POST /down" do
41
53
  it "creates a global downfile" do
42
54
  test_service = LitmusPaper::Service.new('test', [AlwaysAvailableDependency.new], [ConstantMetric.new(100)])
43
55
  LitmusPaper.services['test'] = test_service
44
56
 
45
- post "/force/down", :reason => "down for testing"
57
+ post "/down", :reason => "down for testing"
46
58
  last_response.status.should == 201
47
59
 
48
60
  get "/test/status"
49
61
  last_response.status.should == 503
50
62
  last_response.body.should match(/down for testing/)
51
63
  end
64
+ end
52
65
 
66
+ describe "POST /:service/up" do
53
67
  it "creates a service specific upfile" do
54
68
  test_service = LitmusPaper::Service.new('test', [NeverAvailableDependency.new], [ConstantMetric.new(100)])
55
69
  LitmusPaper.services['test'] = test_service
56
70
 
57
- post "/force/up/test", :reason => "up for testing"
71
+ post "/test/up", :reason => "up for testing"
58
72
  last_response.status.should == 201
59
73
 
60
74
  get "/test/status"
@@ -63,18 +77,18 @@ describe LitmusPaper::App do
63
77
  end
64
78
  end
65
79
 
66
- describe "DELETE /force/*" do
80
+ describe "DELETE /up" do
67
81
  it "removes the global upfile" do
68
82
  test_service = LitmusPaper::Service.new('test', [NeverAvailableDependency.new], [ConstantMetric.new(100)])
69
83
  LitmusPaper.services['test'] = test_service
70
84
 
71
- post "/force/up", :reason => "up for testing"
85
+ post "/up", :reason => "up for testing"
72
86
  last_response.status.should == 201
73
87
 
74
88
  get "/test/status"
75
89
  last_response.status.should == 200
76
90
 
77
- delete "/force/up"
91
+ delete "/up"
78
92
  last_response.status.should == 200
79
93
 
80
94
  get "/test/status"
@@ -82,49 +96,53 @@ describe LitmusPaper::App do
82
96
  last_response.body.should_not match(/up for testing/)
83
97
  end
84
98
 
99
+ it "404s if there is no upfile" do
100
+ test_service = LitmusPaper::Service.new('test', [NeverAvailableDependency.new], [ConstantMetric.new(100)])
101
+
102
+ delete "/up"
103
+
104
+ last_response.status.should == 404
105
+ end
106
+ end
107
+
108
+ describe "DELETE /down" do
85
109
  it "removes the global downfile" do
86
110
  test_service = LitmusPaper::Service.new('test', [AlwaysAvailableDependency.new], [ConstantMetric.new(100)])
87
111
  LitmusPaper.services['test'] = test_service
88
112
 
89
- post "/force/down", :reason => "down for testing"
113
+ post "/down", :reason => "down for testing"
90
114
  last_response.status.should == 201
91
115
 
92
116
  get "/test/status"
93
117
  last_response.status.should == 503
94
118
 
95
- delete "/force/down"
119
+ delete "/down"
96
120
  last_response.status.should == 200
97
121
 
98
122
  get "/test/status"
99
123
  last_response.should be_ok
100
124
  last_response.body.should_not match(/down for testing/)
101
125
  end
126
+ end
102
127
 
128
+ describe "DELETE /:service/up" do
103
129
  it "removes a service specific upfile" do
104
130
  test_service = LitmusPaper::Service.new('test', [NeverAvailableDependency.new], [ConstantMetric.new(100)])
105
131
  LitmusPaper.services['test'] = test_service
106
132
 
107
- post "/force/up/test", :reason => "up for testing"
133
+ post "/test/up", :reason => "up for testing"
108
134
  last_response.status.should == 201
109
135
 
110
136
  get "/test/status"
111
137
  last_response.status.should == 200
112
138
  last_response.body.should match(/up for testing/)
113
139
 
114
- delete "/force/up/test"
140
+ delete "/test/up"
115
141
  last_response.status.should == 200
116
142
 
117
143
  get "/test/status"
118
144
  last_response.status.should == 503
119
145
  end
120
-
121
- it "404s if there is no upfile" do
122
- test_service = LitmusPaper::Service.new('test', [NeverAvailableDependency.new], [ConstantMetric.new(100)])
123
-
124
- delete "/up"
125
-
126
- last_response.status.should == 404
127
- end
128
146
  end
129
147
 
130
148
  describe "GET /:service/status" do
@@ -165,8 +183,8 @@ describe LitmusPaper::App do
165
183
  test_service = LitmusPaper::Service.new('test', [AlwaysAvailableDependency.new], [ConstantMetric.new(100)])
166
184
  LitmusPaper.services['test'] = test_service
167
185
 
168
- LitmusPaper::StatusFile.new("up", "test").create("Up for testing")
169
- LitmusPaper::StatusFile.new("down", "test").create("Down for testing")
186
+ LitmusPaper::StatusFile.service_up_file("test").create("Up for testing")
187
+ LitmusPaper::StatusFile.service_down_file("test").create("Down for testing")
170
188
 
171
189
  get "/test/status"
172
190
 
@@ -178,7 +196,7 @@ describe LitmusPaper::App do
178
196
  test_service = LitmusPaper::Service.new('test', [NeverAvailableDependency.new], [ConstantMetric.new(100)])
179
197
  LitmusPaper.services['test'] = test_service
180
198
 
181
- LitmusPaper::StatusFile.new("up", "test").create("Up for testing")
199
+ LitmusPaper::StatusFile.service_up_file("test").create("Up for testing")
182
200
 
183
201
  get "/test/status"
184
202
 
@@ -190,7 +208,7 @@ describe LitmusPaper::App do
190
208
  test_service = LitmusPaper::Service.new('test', [NeverAvailableDependency.new], [ConstantMetric.new(100)])
191
209
  LitmusPaper.services['test'] = test_service
192
210
 
193
- LitmusPaper::StatusFile.new("up", "test").create("Up for testing")
211
+ LitmusPaper::StatusFile.service_up_file("test").create("Up for testing")
194
212
 
195
213
  get "/test/status"
196
214
 
@@ -202,8 +220,8 @@ describe LitmusPaper::App do
202
220
  test_service = LitmusPaper::Service.new('test', [AlwaysAvailableDependency.new], [ConstantMetric.new(100)])
203
221
  LitmusPaper.services['test'] = test_service
204
222
 
205
- LitmusPaper::StatusFile.new("global_down").create("Down for testing")
206
- LitmusPaper::StatusFile.new("global_up").create("Up for testing")
223
+ LitmusPaper::StatusFile.global_down_file.create("Down for testing")
224
+ LitmusPaper::StatusFile.global_up_file.create("Up for testing")
207
225
 
208
226
  get "/test/status"
209
227
 
@@ -215,7 +233,7 @@ describe LitmusPaper::App do
215
233
  test_service = LitmusPaper::Service.new('test', [AlwaysAvailableDependency.new], [ConstantMetric.new(100)])
216
234
  LitmusPaper.services['test'] = test_service
217
235
 
218
- LitmusPaper::StatusFile.new("global_down").create("Down for testing")
236
+ LitmusPaper::StatusFile.global_down_file.create("Down for testing")
219
237
 
220
238
  get "/test/status"
221
239
 
@@ -227,7 +245,7 @@ describe LitmusPaper::App do
227
245
  test_service = LitmusPaper::Service.new('test', [NeverAvailableDependency.new], [ConstantMetric.new(100)])
228
246
  LitmusPaper.services['test'] = test_service
229
247
 
230
- LitmusPaper::StatusFile.new("global_up").create("Up for testing")
248
+ LitmusPaper::StatusFile.global_up_file.create("Up for testing")
231
249
 
232
250
  get "/test/status"
233
251
 
@@ -14,6 +14,12 @@ describe 'litmusctl' do
14
14
  system "kill -9 `cat /tmp/litmus.pid`"
15
15
  end
16
16
 
17
+ describe 'help' do
18
+ it "is displayed if no command is given" do
19
+ _litmusctl('').should match("Commands:")
20
+ end
21
+ end
22
+
17
23
  describe 'list' do
18
24
  it "returns the list of services running" do
19
25
  _litmusctl('list').should match("test")
@@ -23,7 +23,7 @@ describe LitmusPaper::Service do
23
23
  service.depends AlwaysAvailableDependency
24
24
  service.measure_health ConstantMetric, :weight => 50
25
25
 
26
- LitmusPaper::StatusFile.new("down", "test").create("Down for testing")
26
+ LitmusPaper::StatusFile.service_down_file("test").create("Down for testing")
27
27
 
28
28
  service.current_health.value.should == 0
29
29
  service.current_health.summary.should == "Down for testing"
@@ -34,7 +34,7 @@ describe LitmusPaper::Service do
34
34
  service.depends AlwaysAvailableDependency
35
35
  service.measure_health ConstantMetric, :weight => 50
36
36
 
37
- LitmusPaper::StatusFile.new("down", "test").create("Down for testing")
37
+ LitmusPaper::StatusFile.global_down_file.create("Down for testing")
38
38
 
39
39
  service.current_health.value.should == 0
40
40
  service.current_health.summary.should == "Down for testing"
@@ -45,7 +45,7 @@ describe LitmusPaper::Service do
45
45
  service.depends NeverAvailableDependency
46
46
  service.measure_health ConstantMetric, :weight => 50
47
47
 
48
- LitmusPaper::StatusFile.new("up", "test").create("Up for testing")
48
+ LitmusPaper::StatusFile.service_up_file("test").create("Up for testing")
49
49
 
50
50
  service.current_health.value.should == 100
51
51
  service.current_health.summary.should == "Up for testing"
@@ -56,7 +56,7 @@ describe LitmusPaper::Service do
56
56
  service.depends NeverAvailableDependency
57
57
  service.measure_health ConstantMetric, :weight => 50
58
58
 
59
- LitmusPaper::StatusFile.new("global_up").create("Up for testing")
59
+ LitmusPaper::StatusFile.global_up_file.create("Up for testing")
60
60
 
61
61
  service.current_health.value.should == 100
62
62
  service.current_health.summary.should == "Up for testing"
@@ -2,22 +2,15 @@ require 'spec_helper'
2
2
 
3
3
  describe LitmusPaper::StatusFile do
4
4
  describe "create" do
5
- it "creates a nested file" do
6
- status_file = LitmusPaper::StatusFile.new("foo", "bar")
7
- status_file.create("for testing")
8
-
9
- status_file.exists?.should == true
10
- end
11
-
12
5
  it "creates a file" do
13
- status_file = LitmusPaper::StatusFile.new("foo")
6
+ status_file = LitmusPaper::StatusFile.new("foo", 100)
14
7
  status_file.create("for testing")
15
8
 
16
9
  status_file.exists?.should == true
17
10
  end
18
11
 
19
12
  it "writes the content" do
20
- status_file = LitmusPaper::StatusFile.new("foo")
13
+ status_file = LitmusPaper::StatusFile.new("foo", 100)
21
14
  status_file.create("for testing")
22
15
 
23
16
  status_file.content.should == "for testing"
@@ -26,7 +19,7 @@ describe LitmusPaper::StatusFile do
26
19
 
27
20
  describe "delete" do
28
21
  it "removes the file" do
29
- status_file = LitmusPaper::StatusFile.new("foo")
22
+ status_file = LitmusPaper::StatusFile.new("foo", 100)
30
23
  status_file.create("for testing")
31
24
 
32
25
  status_file.exists?.should be_true
metadata CHANGED
@@ -1,102 +1,146 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: litmus_paper
3
- version: !ruby/object:Gem::Version
4
- version: 0.3.5
5
- prerelease:
3
+ version: !ruby/object:Gem::Version
4
+ hash: 15
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 4
9
+ - 0
10
+ version: 0.4.0
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Braintreeps
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2012-06-27 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: sinatra
16
- requirement: &70352324743640 !ruby/object:Gem::Requirement
17
+
18
+ date: 2012-07-17 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ version_requirements: &id001 !ruby/object:Gem::Requirement
17
23
  none: false
18
- requirements:
24
+ requirements:
19
25
  - - ~>
20
- - !ruby/object:Gem::Version
26
+ - !ruby/object:Gem::Version
27
+ hash: 31
28
+ segments:
29
+ - 1
30
+ - 3
31
+ - 2
21
32
  version: 1.3.2
33
+ requirement: *id001
22
34
  type: :runtime
35
+ name: sinatra
23
36
  prerelease: false
24
- version_requirements: *70352324743640
25
- - !ruby/object:Gem::Dependency
26
- name: facter
27
- requirement: &70352324742900 !ruby/object:Gem::Requirement
37
+ - !ruby/object:Gem::Dependency
38
+ version_requirements: &id002 !ruby/object:Gem::Requirement
28
39
  none: false
29
- requirements:
40
+ requirements:
30
41
  - - ~>
31
- - !ruby/object:Gem::Version
42
+ - !ruby/object:Gem::Version
43
+ hash: 1
44
+ segments:
45
+ - 1
46
+ - 6
47
+ - 7
32
48
  version: 1.6.7
49
+ requirement: *id002
33
50
  type: :runtime
51
+ name: facter
34
52
  prerelease: false
35
- version_requirements: *70352324742900
36
- - !ruby/object:Gem::Dependency
37
- name: SyslogLogger
38
- requirement: &70352324742440 !ruby/object:Gem::Requirement
53
+ - !ruby/object:Gem::Dependency
54
+ version_requirements: &id003 !ruby/object:Gem::Requirement
39
55
  none: false
40
- requirements:
56
+ requirements:
41
57
  - - ~>
42
- - !ruby/object:Gem::Version
58
+ - !ruby/object:Gem::Version
59
+ hash: 5
60
+ segments:
61
+ - 1
62
+ - 4
63
+ - 1
43
64
  version: 1.4.1
65
+ requirement: *id003
44
66
  type: :runtime
67
+ name: SyslogLogger
45
68
  prerelease: false
46
- version_requirements: *70352324742440
47
- - !ruby/object:Gem::Dependency
48
- name: rspec
49
- requirement: &70352324741920 !ruby/object:Gem::Requirement
69
+ - !ruby/object:Gem::Dependency
70
+ version_requirements: &id004 !ruby/object:Gem::Requirement
50
71
  none: false
51
- requirements:
72
+ requirements:
52
73
  - - ~>
53
- - !ruby/object:Gem::Version
74
+ - !ruby/object:Gem::Version
75
+ hash: 43
76
+ segments:
77
+ - 2
78
+ - 9
79
+ - 0
54
80
  version: 2.9.0
81
+ requirement: *id004
55
82
  type: :development
83
+ name: rspec
56
84
  prerelease: false
57
- version_requirements: *70352324741920
58
- - !ruby/object:Gem::Dependency
59
- name: rack-test
60
- requirement: &70352324741220 !ruby/object:Gem::Requirement
85
+ - !ruby/object:Gem::Dependency
86
+ version_requirements: &id005 !ruby/object:Gem::Requirement
61
87
  none: false
62
- requirements:
88
+ requirements:
63
89
  - - ~>
64
- - !ruby/object:Gem::Version
90
+ - !ruby/object:Gem::Version
91
+ hash: 5
92
+ segments:
93
+ - 0
94
+ - 6
95
+ - 1
65
96
  version: 0.6.1
97
+ requirement: *id005
66
98
  type: :development
99
+ name: rack-test
67
100
  prerelease: false
68
- version_requirements: *70352324741220
69
- - !ruby/object:Gem::Dependency
70
- name: rake
71
- requirement: &70352324740620 !ruby/object:Gem::Requirement
101
+ - !ruby/object:Gem::Dependency
102
+ version_requirements: &id006 !ruby/object:Gem::Requirement
72
103
  none: false
73
- requirements:
104
+ requirements:
74
105
  - - ~>
75
- - !ruby/object:Gem::Version
106
+ - !ruby/object:Gem::Version
107
+ hash: 11
108
+ segments:
109
+ - 0
110
+ - 9
111
+ - 2
112
+ - 2
76
113
  version: 0.9.2.2
114
+ requirement: *id006
77
115
  type: :development
116
+ name: rake
78
117
  prerelease: false
79
- version_requirements: *70352324740620
80
- - !ruby/object:Gem::Dependency
81
- name: rake_commit
82
- requirement: &70352324740160 !ruby/object:Gem::Requirement
118
+ - !ruby/object:Gem::Dependency
119
+ version_requirements: &id007 !ruby/object:Gem::Requirement
83
120
  none: false
84
- requirements:
121
+ requirements:
85
122
  - - ~>
86
- - !ruby/object:Gem::Version
87
- version: '0.13'
123
+ - !ruby/object:Gem::Version
124
+ hash: 17
125
+ segments:
126
+ - 0
127
+ - 13
128
+ version: "0.13"
129
+ requirement: *id007
88
130
  type: :development
131
+ name: rake_commit
89
132
  prerelease: false
90
- version_requirements: *70352324740160
91
133
  description: Backend health tester for HA Services
92
- email:
134
+ email:
93
135
  - code@getbraintree.com
94
- executables:
136
+ executables:
95
137
  - litmus
96
138
  - litmusctl
97
139
  extensions: []
140
+
98
141
  extra_rdoc_files: []
99
- files:
142
+
143
+ files:
100
144
  - .gitignore
101
145
  - .rake_commit
102
146
  - .rvmrc
@@ -112,6 +156,10 @@ files:
112
156
  - lib/litmus_paper.rb
113
157
  - lib/litmus_paper/app.rb
114
158
  - lib/litmus_paper/cli/admin.rb
159
+ - lib/litmus_paper/cli/admin/command.rb
160
+ - lib/litmus_paper/cli/admin/force.rb
161
+ - lib/litmus_paper/cli/admin/list.rb
162
+ - lib/litmus_paper/cli/admin/status.rb
115
163
  - lib/litmus_paper/cli/server.rb
116
164
  - lib/litmus_paper/configuration.rb
117
165
  - lib/litmus_paper/dependency/haproxy_backends.rb
@@ -155,31 +203,41 @@ files:
155
203
  - spec/support/stub_facter.rb
156
204
  - spec/support/test.config
157
205
  - spec/support/test.d.config
206
+ has_rdoc: true
158
207
  homepage: https://github.com/braintree/litmus_paper
159
208
  licenses: []
209
+
160
210
  post_install_message:
161
211
  rdoc_options: []
162
- require_paths:
212
+
213
+ require_paths:
163
214
  - lib
164
- required_ruby_version: !ruby/object:Gem::Requirement
215
+ required_ruby_version: !ruby/object:Gem::Requirement
165
216
  none: false
166
- requirements:
167
- - - ! '>='
168
- - !ruby/object:Gem::Version
169
- version: '0'
170
- required_rubygems_version: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - ">="
219
+ - !ruby/object:Gem::Version
220
+ hash: 3
221
+ segments:
222
+ - 0
223
+ version: "0"
224
+ required_rubygems_version: !ruby/object:Gem::Requirement
171
225
  none: false
172
- requirements:
173
- - - ! '>='
174
- - !ruby/object:Gem::Version
175
- version: '0'
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ hash: 3
230
+ segments:
231
+ - 0
232
+ version: "0"
176
233
  requirements: []
234
+
177
235
  rubyforge_project:
178
- rubygems_version: 1.8.10
236
+ rubygems_version: 1.3.7
179
237
  signing_key:
180
238
  specification_version: 3
181
239
  summary: Backend health tester for HA Services, partner project of big_brother
182
- test_files:
240
+ test_files:
183
241
  - spec/litmus_paper/app_spec.rb
184
242
  - spec/litmus_paper/cli/admin_spec.rb
185
243
  - spec/litmus_paper/cli/server_spec.rb