maxwell_agent 0.0.5 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,15 +3,18 @@ module Maxwell
3
3
  class WorkSchedule
4
4
  include Celluloid
5
5
 
6
+ def initialize
7
+ @schedule = RedisObjects::SortedSet.new_link('work_schedule')
8
+ @working = RedisObjects::Set.new_link('work_schedule:working')
9
+ end
10
+
6
11
  def add(work)
7
- async.add_work(work)
12
+ @schedule.async.add(work.generate_rank, work)
8
13
  work
9
14
  end
10
15
 
11
16
  def count
12
- redis do |redis|
13
- redis.zcard 'work_schedule'
14
- end
17
+ schedule.count
15
18
  end
16
19
 
17
20
  def get
@@ -19,22 +22,16 @@ module Maxwell
19
22
  end
20
23
 
21
24
  def put_back(work)
22
- remove_from_working_queue(work)
23
- async.add(work)
25
+ @working.async.remove(work)
26
+ add(work)
24
27
  end
25
28
 
26
29
  def working
27
- work_items = redis do |redis|
28
- redis.smembers 'work_schedule:working'
29
- end
30
- work_items.map {|work| Work.load(work) }
30
+ @working.all.map {|work| Work.load(work) }
31
31
  end
32
32
 
33
33
  def schedule
34
- work_items = redis do |redis|
35
- redis.zrange 'work_schedule', 0, -1
36
- end
37
- work_items.map {|work| Work.load(work) }
34
+ @schedule.all.map {|work| Work.load(work) }
38
35
  end
39
36
 
40
37
  def all
@@ -42,57 +39,27 @@ module Maxwell
42
39
  end
43
40
 
44
41
  private
45
- def redis(&block)
46
- Agent.redis(&block)
47
- end
48
42
 
49
43
  def find_ready_for_work
50
44
  work = get_work
51
- move_to_working_queue(work) if work && work.work_now?
52
- work
45
+ if work && work.work_now?
46
+ move_to_working_queue(work)
47
+ work
48
+ end
53
49
  end
54
50
 
55
51
  def get_work
56
- work = redis do |redis|
57
- redis.zrange('work_schedule', 0, 0)[0]
58
- end
59
-
52
+ work = @schedule.first
60
53
  Work.load(work) if work
61
54
  end
62
55
 
63
56
  def move_to_working_queue(work)
64
- add_to_working_queue(work)
65
- remove_from_main_queue(work)
66
- end
67
-
68
- def remove_from_main_queue(work)
69
- redis do |redis|
70
- redis.zrem 'work_schedule', work.to_json
71
- end
72
- end
73
-
74
- def add_to_working_queue(work)
75
- redis do |redis|
76
- redis.sadd 'work_schedule:working', work.to_json
77
- end
78
- end
79
-
80
- def remove_from_working_queue(work)
81
- redis do |redis|
82
- redis.srem 'work_schedule:working', work.to_json
83
- end
84
- end
85
-
86
- def add_work(work)
87
- redis do |redis|
88
- redis.zadd 'work_schedule', work.generate_rank, work.to_json
89
- end
57
+ @working.async.add(work)
58
+ @schedule.async.remove(work)
90
59
  end
91
60
 
92
61
  def is_being_worked_on?(work)
93
- redis do |redis|
94
- redis.sismember 'work_schedule:working', work.to_json
95
- end
62
+ @working.exists?(work)
96
63
  end
97
64
  end
98
65
  end
@@ -1,7 +1,6 @@
1
1
  module Maxwell
2
2
  module Agent
3
3
  class Worker
4
- include Celluloid
5
4
 
6
5
  def perform(work)
7
6
  work.perform
@@ -21,7 +20,7 @@ module Maxwell
21
20
  work.perform_at = nil
22
21
  work.last_run = Time.now
23
22
 
24
- Agent.middleware.invoke(work)
23
+ Agent.runner[:middleware_runner].inoke(work)
25
24
  end
26
25
  end
27
26
  end
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency "fakeredis"
26
26
 
27
27
  spec.add_runtime_dependency "celluloid", "~> 0.15.0"
28
+ spec.add_runtime_dependency "celluloid-io"
28
29
  spec.add_runtime_dependency "activesupport"
29
30
  spec.add_runtime_dependency "connection_pool"
30
31
  spec.add_runtime_dependency "redis"
@@ -0,0 +1,2 @@
1
+ Plugins go in this dir
2
+ They will be automatically required
@@ -0,0 +1,15 @@
1
+ module Maxwell
2
+ module Agent
3
+ module Plugin
4
+ class CheckShell
5
+ include Maxwell::Agent::Probe
6
+
7
+ def perform(*args)
8
+ cmd = args.shift
9
+ args = args.join(' ')
10
+ system("#{cmd} #{args}")
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+ module Maxwell
3
+ module Agent
4
+ describe Probe do
5
+
6
+ context 'Probe is included' do
7
+ Given(:probe) { Class.new { include Probe } }
8
+ When(:result) { probe.work_type }
9
+ Then { expect(result).to eq(:non_evented) }
10
+ end
11
+ end
12
+ end
13
+ end
@@ -2,12 +2,7 @@ require 'spec_helper'
2
2
  module Maxwell
3
3
  module Agent
4
4
  describe Scheduler do
5
- before :each do
6
- runner = double(:runner)
7
- Agent.stub(:runner).and_return(runner)
8
- allow(runner).to receive(:[]).with(:scheduler).and_return(Maxwell::Scheduler.new)
9
- end
10
- Given(:scheduler) { Agent.runner[:scheduler] }
5
+
11
6
  end
12
7
  end
13
8
  end
@@ -10,24 +10,24 @@ module Maxwell
10
10
  end
11
11
 
12
12
  Given(:queue) { Agent.runner[:work_schedule] }
13
- Given(:work) { WorkTest.new.load(name: 'foo', work_class: 'bar') }
13
+ Given(:work) { Host::Service.new(name: 'foo', work_class: 'bar') }
14
14
  describe '.add' do
15
15
  context 'Work is added' do
16
16
  When(:result) { queue.add(work) }
17
- Then { expect(queue.count).to be 1 }
17
+ Then { expect(queue.count).to eq 1 }
18
18
  end
19
19
  context 'The same Work is added 2x' do
20
20
  Given { queue.add(work) }
21
21
  When { queue.add(work) }
22
- Then { expect(queue.count).to be 1 }
22
+ Then { expect(queue.count).to eq 1 }
23
23
  end
24
24
  end
25
25
 
26
26
  describe '.working' do
27
27
  Given { queue.add(work) }
28
28
  When { queue.get }
29
- Then { expect(queue.working.count).to be 1 }
30
- And { expect(queue.count).to be 0 }
29
+ Then { expect(queue.working.count).to eq 1 }
30
+ And { expect(queue.count).to eq 0 }
31
31
  end
32
32
 
33
33
  describe '.put_back' do
@@ -40,12 +40,12 @@ module Maxwell
40
40
 
41
41
  describe '.all' do
42
42
  Given { queue.add(work) }
43
- Given { queue.add(WorkTest.new.load(name: 'foo', work_class: 'bar',
43
+ Given { queue.add(Host::Service.new(name: 'foo', work_class: 'bar',
44
44
  perform_at: 5.minutes.ago)) }
45
45
  When { queue.get }
46
- Then { expect(queue.all.count).to be 2 }
47
- And { expect(queue.working.count).to be 1 }
48
- And { expect(queue.schedule.count).to be 1 }
46
+ Then { expect(queue.all.count).to eq 2 }
47
+ And { expect(queue.working.count).to eq 1 }
48
+ And { expect(queue.schedule.count).to eq 1 }
49
49
  end
50
50
 
51
51
  end
@@ -4,25 +4,14 @@ class Bar; end
4
4
 
5
5
  module Maxwell
6
6
  module Agent
7
- class WorkTest
7
+ class WorkTest < Host::Service
8
8
  include Work
9
- def initialize(attrs={})
10
- attrs.each do |key, value|
11
- send("#{key}=", value)
12
- end
13
- end
14
9
  end
15
10
 
16
11
  describe Work do
17
12
  Given(:work) { WorkTest.new name: :foo, work_class: 'Foo' }
18
13
  Given(:work2) { WorkTest.new name: :bar, work_class: 'Bar' }
19
14
 
20
- describe '#load' do
21
- Given(:work_json) { work.to_json }
22
- When(:result) { Work.load(work_json) }
23
- Then { expect(work_json).to eq(result.to_json) }
24
- end
25
-
26
15
  describe '.work_now?' do
27
16
  context 'work is scheduled normally' do
28
17
  Given { work.last_run = 1000.hours.ago }
@@ -1,10 +1,10 @@
1
1
  require 'rspec/given'
2
- require 'fakeredis/rspec'
3
2
  require 'maxwell/agent'
4
3
 
5
4
  RSpec.configure do |config|
6
5
  config.before(:each) do
7
6
  Celluloid.shutdown
8
7
  Celluloid.boot
8
+ Maxwell::Agent.redis {|redis| redis.flushdb }
9
9
  end
10
10
  end
metadata CHANGED
@@ -1,167 +1,191 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maxwell_agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Goff
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-30 00:00:00.000000000 Z
11
+ date: 2014-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- version_requirements: !ruby/object:Gem::Requirement
15
- requirements:
16
- - - "~>"
17
- - !ruby/object:Gem::Version
18
- version: '1.3'
19
- prerelease: false
20
- type: :development
21
14
  name: bundler
22
15
  requirement: !ruby/object:Gem::Requirement
23
16
  requirements:
24
- - - "~>"
17
+ - - ~>
25
18
  - !ruby/object:Gem::Version
26
19
  version: '1.3'
27
- - !ruby/object:Gem::Dependency
20
+ type: :development
21
+ prerelease: false
28
22
  version_requirements: !ruby/object:Gem::Requirement
29
23
  requirements:
30
- - - ">="
24
+ - - ~>
31
25
  - !ruby/object:Gem::Version
32
- version: '0'
33
- prerelease: false
34
- type: :development
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
35
28
  name: rake
36
29
  requirement: !ruby/object:Gem::Requirement
37
30
  requirements:
38
- - - ">="
31
+ - - '>='
39
32
  - !ruby/object:Gem::Version
40
33
  version: '0'
41
- - !ruby/object:Gem::Dependency
34
+ type: :development
35
+ prerelease: false
42
36
  version_requirements: !ruby/object:Gem::Requirement
43
37
  requirements:
44
- - - ">="
38
+ - - '>='
45
39
  - !ruby/object:Gem::Version
46
40
  version: '0'
47
- prerelease: false
48
- type: :development
41
+ - !ruby/object:Gem::Dependency
49
42
  name: rspec
50
43
  requirement: !ruby/object:Gem::Requirement
51
44
  requirements:
52
- - - ">="
45
+ - - '>='
53
46
  - !ruby/object:Gem::Version
54
47
  version: '0'
55
- - !ruby/object:Gem::Dependency
48
+ type: :development
49
+ prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
51
  requirements:
58
- - - ">="
52
+ - - '>='
59
53
  - !ruby/object:Gem::Version
60
54
  version: '0'
61
- prerelease: false
62
- type: :development
55
+ - !ruby/object:Gem::Dependency
63
56
  name: rpsec-given
64
57
  requirement: !ruby/object:Gem::Requirement
65
58
  requirements:
66
- - - ">="
59
+ - - '>='
67
60
  - !ruby/object:Gem::Version
68
61
  version: '0'
69
- - !ruby/object:Gem::Dependency
62
+ type: :development
63
+ prerelease: false
70
64
  version_requirements: !ruby/object:Gem::Requirement
71
65
  requirements:
72
- - - ">="
66
+ - - '>='
73
67
  - !ruby/object:Gem::Version
74
68
  version: '0'
75
- prerelease: false
76
- type: :development
69
+ - !ruby/object:Gem::Dependency
77
70
  name: fakeredis
78
71
  requirement: !ruby/object:Gem::Requirement
79
72
  requirements:
80
- - - ">="
73
+ - - '>='
81
74
  - !ruby/object:Gem::Version
82
75
  version: '0'
83
- - !ruby/object:Gem::Dependency
76
+ type: :development
77
+ prerelease: false
84
78
  version_requirements: !ruby/object:Gem::Requirement
85
79
  requirements:
86
- - - "~>"
80
+ - - '>='
87
81
  - !ruby/object:Gem::Version
88
- version: 0.15.0
89
- prerelease: false
90
- type: :runtime
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
91
84
  name: celluloid
92
85
  requirement: !ruby/object:Gem::Requirement
93
86
  requirements:
94
- - - "~>"
87
+ - - ~>
95
88
  - !ruby/object:Gem::Version
96
89
  version: 0.15.0
97
- - !ruby/object:Gem::Dependency
90
+ type: :runtime
91
+ prerelease: false
98
92
  version_requirements: !ruby/object:Gem::Requirement
99
93
  requirements:
100
- - - ">="
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: 0.15.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: celluloid-io
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
101
102
  - !ruby/object:Gem::Version
102
103
  version: '0'
103
- prerelease: false
104
104
  type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
105
112
  name: activesupport
106
113
  requirement: !ruby/object:Gem::Requirement
107
114
  requirements:
108
- - - ">="
115
+ - - '>='
109
116
  - !ruby/object:Gem::Version
110
117
  version: '0'
111
- - !ruby/object:Gem::Dependency
118
+ type: :runtime
119
+ prerelease: false
112
120
  version_requirements: !ruby/object:Gem::Requirement
113
121
  requirements:
114
- - - ">="
122
+ - - '>='
115
123
  - !ruby/object:Gem::Version
116
124
  version: '0'
117
- prerelease: false
118
- type: :runtime
125
+ - !ruby/object:Gem::Dependency
119
126
  name: connection_pool
120
127
  requirement: !ruby/object:Gem::Requirement
121
128
  requirements:
122
- - - ">="
129
+ - - '>='
123
130
  - !ruby/object:Gem::Version
124
131
  version: '0'
125
- - !ruby/object:Gem::Dependency
132
+ type: :runtime
133
+ prerelease: false
126
134
  version_requirements: !ruby/object:Gem::Requirement
127
135
  requirements:
128
- - - ">="
136
+ - - '>='
129
137
  - !ruby/object:Gem::Version
130
138
  version: '0'
131
- prerelease: false
132
- type: :runtime
139
+ - !ruby/object:Gem::Dependency
133
140
  name: redis
134
141
  requirement: !ruby/object:Gem::Requirement
135
142
  requirements:
136
- - - ">="
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
137
151
  - !ruby/object:Gem::Version
138
152
  version: '0'
139
153
  description: Maxwell Agent
140
154
  email:
141
155
  - cpuguy83@gmail.com
142
- executables: []
156
+ executables:
157
+ - agent.rb
143
158
  extensions: []
144
159
  extra_rdoc_files: []
145
160
  files:
146
- - ".document"
147
- - ".gitignore"
148
- - ".travis.yml"
161
+ - .document
162
+ - .gitignore
163
+ - .travis.yml
149
164
  - Gemfile
150
165
  - Gemfile.lock
151
166
  - Guardfile
152
167
  - LICENSE.txt
153
168
  - README.md
154
169
  - Rakefile
170
+ - bin/agent.rb
155
171
  - config/host_configuration.json
156
172
  - lib/maxwell/agent.rb
173
+ - lib/maxwell/agent/attributes.rb
174
+ - lib/maxwell/agent/coercable.rb
157
175
  - lib/maxwell/agent/configuration.rb
158
- - lib/maxwell/agent/dynamic_attributes.rb
176
+ - lib/maxwell/agent/evented_worker.rb
159
177
  - lib/maxwell/agent/host.rb
178
+ - lib/maxwell/agent/host/service.rb
160
179
  - lib/maxwell/agent/middleware/chain.rb
161
180
  - lib/maxwell/agent/middleware/logging.rb
181
+ - lib/maxwell/agent/middleware_runner.rb
162
182
  - lib/maxwell/agent/probe.rb
183
+ - lib/maxwell/agent/redis_objects.rb
184
+ - lib/maxwell/agent/redis_objects/set.rb
185
+ - lib/maxwell/agent/redis_objects/sorted_set.rb
163
186
  - lib/maxwell/agent/runner.rb
164
187
  - lib/maxwell/agent/scheduler.rb
188
+ - lib/maxwell/agent/standard_worker.rb
165
189
  - lib/maxwell/agent/version.rb
166
190
  - lib/maxwell/agent/web.rb
167
191
  - lib/maxwell/agent/web_helpers.rb
@@ -170,8 +194,11 @@ files:
170
194
  - lib/maxwell/agent/worker.rb
171
195
  - lib/maxwell_agent.rb
172
196
  - maxwell_agent.gemspec
197
+ - plugins/README.md
198
+ - plugins/check_shell.rb
173
199
  - spec/agent/Guardfile
174
200
  - spec/agent/host_spec.rb
201
+ - spec/agent/probe_spec.rb
175
202
  - spec/agent/scheduler_spec.rb
176
203
  - spec/agent/work_schedule_spec.rb
177
204
  - spec/agent/work_spec.rb
@@ -187,23 +214,24 @@ require_paths:
187
214
  - lib
188
215
  required_ruby_version: !ruby/object:Gem::Requirement
189
216
  requirements:
190
- - - ">="
217
+ - - '>='
191
218
  - !ruby/object:Gem::Version
192
219
  version: '0'
193
220
  required_rubygems_version: !ruby/object:Gem::Requirement
194
221
  requirements:
195
- - - ">="
222
+ - - '>='
196
223
  - !ruby/object:Gem::Version
197
224
  version: '0'
198
225
  requirements: []
199
226
  rubyforge_project:
200
- rubygems_version: 2.1.10
227
+ rubygems_version: 2.0.3
201
228
  signing_key:
202
229
  specification_version: 4
203
230
  summary: Maxwell Agent
204
231
  test_files:
205
232
  - spec/agent/Guardfile
206
233
  - spec/agent/host_spec.rb
234
+ - spec/agent/probe_spec.rb
207
235
  - spec/agent/scheduler_spec.rb
208
236
  - spec/agent/work_schedule_spec.rb
209
237
  - spec/agent/work_spec.rb