minicron 0.2 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/bin/minicron +17 -2
- data/lib/minicron.rb +30 -32
- data/lib/minicron/alert/pagerduty.rb +1 -1
- data/lib/minicron/cli.rb +19 -208
- data/lib/minicron/cli/commands.rb +194 -0
- data/lib/minicron/constants.rb +1 -1
- data/lib/minicron/cron.rb +10 -15
- data/lib/minicron/hub/app.rb +2 -2
- data/lib/minicron/hub/controllers/api/hosts.rb +2 -3
- data/lib/minicron/hub/db/schema.rb +65 -70
- data/lib/minicron/hub/db/schema.sql +0 -14
- data/lib/minicron/monitor.rb +1 -1
- data/lib/minicron/transport/client.rb +4 -3
- data/lib/minicron/transport/faye/client.rb +1 -1
- data/lib/minicron/transport/faye/server.rb +6 -6
- data/lib/minicron/transport/server.rb +14 -10
- data/spec/minicron/alert/pagerduty_spec.rb +66 -0
- data/spec/minicron/alert/sms_spec.rb +69 -0
- data/spec/minicron/cli_spec.rb +35 -20
- data/spec/minicron/transport/client_spec.rb +70 -1
- data/spec/minicron/transport/faye/client_spec.rb +41 -27
- data/spec/minicron/transport/server_spec.rb +7 -11
- data/spec/minicron_spec.rb +45 -5
- data/spec/spec_helper.rb +1 -0
- data/spec/valid_config.toml +0 -1
- metadata +110 -92
- data/lib/minicron/hub/assets/js/auth/ember-auth-9.0.7.min.js +0 -2
- data/lib/minicron/hub/assets/js/auth/ember-auth-request-jquery-1.0.3.min.js +0 -1
@@ -163,20 +163,6 @@ CREATE TABLE `schema_migrations` (
|
|
163
163
|
|
164
164
|
|
165
165
|
|
166
|
-
# Dump of table users
|
167
|
-
# ------------------------------------------------------------
|
168
|
-
|
169
|
-
DROP TABLE IF EXISTS `users`;
|
170
|
-
|
171
|
-
CREATE TABLE `users` (
|
172
|
-
`id` int(11) NOT NULL AUTO_INCREMENT,
|
173
|
-
`email` int(11) NOT NULL,
|
174
|
-
`password` int(11) NOT NULL,
|
175
|
-
PRIMARY KEY (`id`)
|
176
|
-
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
177
|
-
|
178
|
-
|
179
|
-
|
180
166
|
|
181
167
|
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
182
168
|
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
data/lib/minicron/monitor.rb
CHANGED
@@ -36,7 +36,7 @@ module Minicron
|
|
36
36
|
|
37
37
|
# TODO: Handle errors here!
|
38
38
|
# Get the job and execution id from the response
|
39
|
-
ids = JSON.parse(responses.first[:body]).first['channel'].split('/')[3]
|
39
|
+
ids = JSON.parse(@responses.first[:body]).first['channel'].split('/')[3]
|
40
40
|
|
41
41
|
# Split them up
|
42
42
|
ids = ids.split('-')
|
@@ -51,8 +51,9 @@ module Minicron
|
|
51
51
|
# Helper that wraps the publish function making it quicker to use
|
52
52
|
#
|
53
53
|
# @option options [String] job_id
|
54
|
-
# @option options [String, Symbol] type status or output
|
55
54
|
# @option options [Integer] execution_id
|
55
|
+
# @option options [String, Symbol] type status or output
|
56
|
+
# @option options [String, Hash]
|
56
57
|
def send(options = {})
|
57
58
|
# Publish the message to the correct channel
|
58
59
|
publish("/job/#{options[:job_id]}/#{options[:execution_id]}/#{options[:type]}", options[:message])
|
@@ -61,7 +62,7 @@ module Minicron
|
|
61
62
|
# Publishes a message on the given channel to the server
|
62
63
|
#
|
63
64
|
# @param channel [String]
|
64
|
-
# @param message [String]
|
65
|
+
# @param message [String, Hash]
|
65
66
|
def publish(channel, message)
|
66
67
|
# Set up the data to send to faye
|
67
68
|
data = { :channel => channel, :data => {
|
@@ -13,7 +13,7 @@ module Minicron
|
|
13
13
|
Faye::WebSocket.load_adapter('thin')
|
14
14
|
|
15
15
|
# Show debug verbose output if requested
|
16
|
-
if Minicron.config['
|
16
|
+
if Minicron.config['verbose']
|
17
17
|
log = Logger.new(STDOUT)
|
18
18
|
log.level = Logger::DEBUG
|
19
19
|
Faye.logger = log
|
@@ -35,23 +35,23 @@ module Minicron
|
|
35
35
|
|
36
36
|
def add_faye_events
|
37
37
|
@server.on(:handshake) do |client_id|
|
38
|
-
p [:handshake, client_id] if Minicron.config['
|
38
|
+
p [:handshake, client_id] if Minicron.config['verbose']
|
39
39
|
end
|
40
40
|
|
41
41
|
@server.on(:subscribe) do |client_id, channel|
|
42
|
-
p [:subscribe, client_id, channel] if Minicron.config['
|
42
|
+
p [:subscribe, client_id, channel] if Minicron.config['verbose']
|
43
43
|
end
|
44
44
|
|
45
45
|
@server.on(:unsubscribe) do |client_id, channel|
|
46
|
-
p [:unsubscribe, client_id, channel] if Minicron.config['
|
46
|
+
p [:unsubscribe, client_id, channel] if Minicron.config['verbose']
|
47
47
|
end
|
48
48
|
|
49
49
|
@server.on(:publish) do |client_id, channel, data|
|
50
|
-
p [:published, client_id, channel, data] if Minicron.config['
|
50
|
+
p [:published, client_id, channel, data] if Minicron.config['verbose']
|
51
51
|
end
|
52
52
|
|
53
53
|
@server.on(:disconnect) do |client_id|
|
54
|
-
p [:disconnect, client_id] if Minicron.config['
|
54
|
+
p [:disconnect, client_id] if Minicron.config['verbose']
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -5,18 +5,22 @@ module Minicron
|
|
5
5
|
module Transport
|
6
6
|
# Used to mangage the web server minicron runs on
|
7
7
|
class Server
|
8
|
-
|
8
|
+
@server = nil
|
9
|
+
|
10
|
+
class << self
|
11
|
+
attr_accessor :server
|
12
|
+
end
|
9
13
|
|
10
14
|
# Starts the thin server
|
11
15
|
#
|
12
16
|
# @param host [String] the host e.g 0.0.0.0
|
13
17
|
# @param port [Integer]
|
14
18
|
# @param path [String] The absolute path to the server e.g /server
|
15
|
-
def start!(host, port, path)
|
19
|
+
def self.start!(host, port, path)
|
16
20
|
return false if running?
|
17
21
|
|
18
22
|
# Start the faye or rails apps depending on the path
|
19
|
-
server = Thin::Server.new(host, port) do
|
23
|
+
@server = Thin::Server.new(host, port) do
|
20
24
|
use Rack::CommonLogger
|
21
25
|
use Rack::ShowExceptions
|
22
26
|
|
@@ -37,25 +41,25 @@ module Minicron
|
|
37
41
|
end
|
38
42
|
end
|
39
43
|
|
40
|
-
server.start
|
44
|
+
@server.start
|
41
45
|
true
|
42
46
|
end
|
43
47
|
|
44
48
|
# Stops the thin server if it's running
|
45
49
|
# @return [Boolean] whether the server was stopped or not
|
46
|
-
def stop!
|
47
|
-
return false unless running? &&
|
50
|
+
def self.stop!
|
51
|
+
return false unless running? && !@server.nil?
|
48
52
|
|
49
|
-
server.stop
|
53
|
+
@server.stop
|
50
54
|
true
|
51
55
|
end
|
52
56
|
|
53
57
|
# Returns a bool based on whether
|
54
58
|
# @return [Boolean]
|
55
|
-
def running?
|
56
|
-
return false unless
|
59
|
+
def self.running?
|
60
|
+
return false unless !@server.nil?
|
57
61
|
|
58
|
-
server.running?
|
62
|
+
@server.running?
|
59
63
|
end
|
60
64
|
end
|
61
65
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Minicron::PagerDuty do
|
4
|
+
describe '#intiailize' do
|
5
|
+
it 'should create an instance of the Pagerduty gem' do
|
6
|
+
pagerduty = Minicron::PagerDuty.new
|
7
|
+
|
8
|
+
expect(pagerduty.instance_variable_get(:@client)).to be_a Pagerduty
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#get_message' do
|
13
|
+
context 'when kind is miss' do
|
14
|
+
it 'should return the correct message' do
|
15
|
+
pagerduty = Minicron::PagerDuty.new
|
16
|
+
time = Time.now.utc
|
17
|
+
options = {
|
18
|
+
:job_id => 1,
|
19
|
+
:expected_at => time,
|
20
|
+
:execution_id => 2,
|
21
|
+
:kind => 'miss'
|
22
|
+
}
|
23
|
+
message = "Job #1 failed to execute at its expected time - #{time}"
|
24
|
+
|
25
|
+
expect(pagerduty.get_message(options)).to eq message
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'when kind is fail' do
|
30
|
+
it 'should return the correct message' do
|
31
|
+
pagerduty = Minicron::PagerDuty.new
|
32
|
+
options = {
|
33
|
+
:job_id => 1,
|
34
|
+
:execution_id => 2,
|
35
|
+
:kind => 'fail'
|
36
|
+
}
|
37
|
+
message = "Execution #2 of Job #1 failed"
|
38
|
+
|
39
|
+
expect(pagerduty.get_message(options)).to eq message
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'when kind is not supported' do
|
44
|
+
it 'should raise an Exception' do
|
45
|
+
pagerduty = Minicron::PagerDuty.new
|
46
|
+
options = {
|
47
|
+
:kind => 'derp'
|
48
|
+
}
|
49
|
+
|
50
|
+
expect do
|
51
|
+
pagerduty.get_message(options)
|
52
|
+
end.to raise_error Exception
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#send' do
|
58
|
+
it 'should trigger an alert on the pagerduty client' do
|
59
|
+
pagerduty = Minicron::PagerDuty.new
|
60
|
+
|
61
|
+
pagerduty.instance_variable_get(:@client).should_receive(:trigger).with('title', :message => 'yo')
|
62
|
+
|
63
|
+
pagerduty.send('title', 'yo')
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Minicron::SMS do
|
4
|
+
before (:each) do
|
5
|
+
Minicron.parse_config_hash({
|
6
|
+
'alerts' => {
|
7
|
+
'sms' => {
|
8
|
+
'twilio' => {
|
9
|
+
'account_sid' => 'abc123',
|
10
|
+
'auth_token' => 'abc456'
|
11
|
+
}
|
12
|
+
}
|
13
|
+
}
|
14
|
+
})
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#intiailize' do
|
18
|
+
it 'should create an instance of the Twilio gem' do
|
19
|
+
sms = Minicron::SMS.new
|
20
|
+
|
21
|
+
expect(sms.instance_variable_get(:@client)).to be_a Twilio::REST::Client
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#get_message' do
|
26
|
+
context 'when kind is miss' do
|
27
|
+
it 'should return the correct message' do
|
28
|
+
sms = Minicron::SMS.new
|
29
|
+
time = Time.now.utc
|
30
|
+
options = {
|
31
|
+
:job_id => 1,
|
32
|
+
:expected_at => time,
|
33
|
+
:execution_id => 2,
|
34
|
+
:kind => 'miss'
|
35
|
+
}
|
36
|
+
message = "minicron alert - job missed!\nJob #1 failed to execute at its expected time: #{time}"
|
37
|
+
|
38
|
+
expect(sms.get_message(options)).to eq message
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'when kind is fail' do
|
43
|
+
it 'should return the correct message' do
|
44
|
+
sms = Minicron::SMS.new
|
45
|
+
options = {
|
46
|
+
:job_id => 1,
|
47
|
+
:execution_id => 2,
|
48
|
+
:kind => 'fail'
|
49
|
+
}
|
50
|
+
message = "minicron alert - job failed!\nExecution #2 of Job #1 failed"
|
51
|
+
|
52
|
+
expect(sms.get_message(options)).to eq message
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
context 'when kind is not supported' do
|
57
|
+
it 'should raise an Exception' do
|
58
|
+
sms = Minicron::SMS.new
|
59
|
+
options = {
|
60
|
+
:kind => 'derp'
|
61
|
+
}
|
62
|
+
|
63
|
+
expect do
|
64
|
+
sms.get_message(options)
|
65
|
+
end.to raise_error Exception
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/spec/minicron/cli_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Minicron::CLI do
|
4
|
-
let(:server) { Minicron::Transport::Server
|
4
|
+
let(:server) { Minicron::Transport::Server }
|
5
5
|
let(:thin_server) { Thin::Server }
|
6
6
|
|
7
7
|
describe '#server' do
|
@@ -23,7 +23,7 @@ describe Minicron::CLI do
|
|
23
23
|
|
24
24
|
context 'when in --dry-run mode' do
|
25
25
|
it 'should run a simple command and print the output to stdout' do
|
26
|
-
Minicron::CLI.
|
26
|
+
Minicron::CLI.run(['run', 'echo hello', '--dry-run', '--trace']) do |output|
|
27
27
|
expect(output.clean).to eq 'hello'
|
28
28
|
end
|
29
29
|
end
|
@@ -31,7 +31,7 @@ describe Minicron::CLI do
|
|
31
31
|
it 'should run a simple multi-line command and print the output to stdout' do
|
32
32
|
command_output = ''
|
33
33
|
|
34
|
-
Minicron::CLI.
|
34
|
+
Minicron::CLI.run(['run', 'echo "hello\nworld"', '--dry-run', '--trace']) do |output|
|
35
35
|
command_output += output
|
36
36
|
end
|
37
37
|
|
@@ -42,7 +42,7 @@ describe Minicron::CLI do
|
|
42
42
|
it 'should return an error' do
|
43
43
|
Minicron.capture_output :type => :stderr do
|
44
44
|
expect do
|
45
|
-
Minicron::CLI.
|
45
|
+
Minicron::CLI.run(%w(gfdjgfdlgj --trace))
|
46
46
|
end.to raise_error SystemExit
|
47
47
|
end
|
48
48
|
end
|
@@ -52,7 +52,7 @@ describe Minicron::CLI do
|
|
52
52
|
it 'should raise ArgumentError' do
|
53
53
|
Minicron.capture_output :type => :stderr do
|
54
54
|
expect do
|
55
|
-
Minicron::CLI.
|
55
|
+
Minicron::CLI.run(%w(run --dry-run --trace))
|
56
56
|
end.to raise_error ArgumentError
|
57
57
|
end
|
58
58
|
end
|
@@ -61,7 +61,7 @@ describe Minicron::CLI do
|
|
61
61
|
|
62
62
|
context 'when in --dry-run mode with a valid --config file passed' do
|
63
63
|
it 'should run a simple command and print the output to stdout' do
|
64
|
-
Minicron::CLI.
|
64
|
+
Minicron::CLI.run(['run', 'echo hello', '--dry-run', '--trace', '--config', './default.config.toml']) do |output|
|
65
65
|
expect(output.clean).to eq 'hello'
|
66
66
|
end
|
67
67
|
end
|
@@ -69,7 +69,7 @@ describe Minicron::CLI do
|
|
69
69
|
it 'should run a simple multi-line command and print the output to stdout' do
|
70
70
|
command_output = ''
|
71
71
|
|
72
|
-
Minicron::CLI.
|
72
|
+
Minicron::CLI.run(['run', 'echo "hello\nworld"', '--dry-run', '--trace', '--config', './default.config.toml']) do |output|
|
73
73
|
command_output += output
|
74
74
|
end
|
75
75
|
|
@@ -80,7 +80,7 @@ describe Minicron::CLI do
|
|
80
80
|
it 'should return an error' do
|
81
81
|
Minicron.capture_output :type => :stderr do
|
82
82
|
expect do
|
83
|
-
Minicron::CLI.
|
83
|
+
Minicron::CLI.run(['dfsfsdfsdfs', '--trace'])
|
84
84
|
end.to raise_error SystemExit
|
85
85
|
end
|
86
86
|
end
|
@@ -90,28 +90,45 @@ describe Minicron::CLI do
|
|
90
90
|
it 'should raise ArgumentError' do
|
91
91
|
Minicron.capture_output :type => :stderr do
|
92
92
|
expect do
|
93
|
-
Minicron::CLI.
|
93
|
+
Minicron::CLI.run(['run', '--dry-run', '--trace', '--config', './default.config.toml'])
|
94
94
|
end.to raise_error ArgumentError
|
95
95
|
end
|
96
96
|
end
|
97
97
|
end
|
98
98
|
end
|
99
|
+
|
100
|
+
context 'when run in --verbose mode' do
|
101
|
+
it 'should set the verbose to true' do
|
102
|
+
Minicron.capture_output :type => :stderr do
|
103
|
+
Minicron::CLI.run(['run', '--dry-run', '--trace', '--verbose', 'echo 1']) {}
|
104
|
+
|
105
|
+
expect(Minicron.config['verbose']).to eq true
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
99
109
|
end
|
100
110
|
|
101
111
|
describe '#run_command' do
|
102
112
|
context 'when in verbose mode' do
|
103
113
|
it 'a one line command should result in 7 total line' do
|
104
|
-
|
105
|
-
minicron.disable_coloured_output!
|
114
|
+
Minicron::CLI.disable_coloured_output!
|
106
115
|
output = ''
|
107
116
|
|
108
|
-
|
117
|
+
Minicron::CLI.run_command('echo 1', :verbose => true) do |line|
|
109
118
|
output += line[:output]
|
110
119
|
end
|
111
120
|
|
112
121
|
expect(output.split("\n").length).to eq 7
|
113
122
|
end
|
114
123
|
end
|
124
|
+
|
125
|
+
context 'when a non-existent command is run' do
|
126
|
+
it 'should raise an Exception' do
|
127
|
+
expect do
|
128
|
+
Minicron::CLI.run_command('fdsfsdfsd') {}
|
129
|
+
end.to raise_error Exception
|
130
|
+
end
|
131
|
+
end
|
115
132
|
end
|
116
133
|
|
117
134
|
describe '#coloured_output?' do
|
@@ -119,7 +136,7 @@ describe Minicron::CLI do
|
|
119
136
|
it 'should return true' do
|
120
137
|
Rainbow.enabled = true
|
121
138
|
|
122
|
-
expect(Minicron::CLI.
|
139
|
+
expect(Minicron::CLI.coloured_output?).to eq true
|
123
140
|
end
|
124
141
|
end
|
125
142
|
|
@@ -127,28 +144,26 @@ describe Minicron::CLI do
|
|
127
144
|
it 'should return false' do
|
128
145
|
Rainbow.enabled = false
|
129
146
|
|
130
|
-
expect(Minicron::CLI.
|
147
|
+
expect(Minicron::CLI.coloured_output?).to eq false
|
131
148
|
end
|
132
149
|
end
|
133
150
|
end
|
134
151
|
|
135
152
|
describe '#enable_coloured_output!' do
|
136
153
|
it 'should set Rainbow.enabled to true' do
|
137
|
-
|
138
|
-
minicron.enable_coloured_output!
|
154
|
+
Minicron::CLI.enable_coloured_output!
|
139
155
|
|
140
156
|
expect(Rainbow.enabled).to eq true
|
141
|
-
expect(
|
157
|
+
expect(Minicron::CLI.coloured_output?).to eq true
|
142
158
|
end
|
143
159
|
end
|
144
160
|
|
145
161
|
describe '#disable_coloured_output!' do
|
146
162
|
it 'should set Rainbow.enabled to false' do
|
147
|
-
|
148
|
-
minicron.disable_coloured_output!
|
163
|
+
Minicron::CLI.disable_coloured_output!
|
149
164
|
|
150
165
|
expect(Rainbow.enabled).to eq false
|
151
|
-
expect(
|
166
|
+
expect(Minicron::CLI.coloured_output?).to eq false
|
152
167
|
end
|
153
168
|
end
|
154
169
|
end
|