double_decker 0.1.0 → 0.1.1
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.
- checksums.yaml +4 -4
- data/src/double_decker/agent.rb +65 -0
- data/src/double_decker/bus.rb +34 -0
- data/src/double_decker/bus_data.rb +42 -0
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 720e2cbc7fe7d4e394fa6334c31323777fbd849146b3ea71b919b4683fbedc7b
|
4
|
+
data.tar.gz: c076994dcb91a33c6d58539eb0e69e3dd4a27262fd7e8f299ca84da389cec7a9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9702a9da87d92ad5aa9271ac64937f5e975c17ca321b462311413d66e06413f5d3434986b488562917bb1575de73735b7580e6eb90ec39b71f34b1e02437d89e
|
7
|
+
data.tar.gz: 15877c849403d831319ffce729adfab623140c470bd23d3f574cf7bdc1cda68c9b6c6c47c596082b9d1103dc828b1c3c1d293b12388b7b4374f790e936c83d3a
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module DoubleDecker
|
2
|
+
class Agent
|
3
|
+
attr_reader :id, :end_time
|
4
|
+
|
5
|
+
def initialize(bus, bus_data, expected_agents, merge_proc: nil)
|
6
|
+
@bus = bus
|
7
|
+
@bus_data = bus_data
|
8
|
+
@expected_agents = expected_agents
|
9
|
+
@finished = nil
|
10
|
+
@merge_proc = merge_proc
|
11
|
+
@id = setup!
|
12
|
+
merge({})
|
13
|
+
end
|
14
|
+
|
15
|
+
def merge_like(&block)
|
16
|
+
@merge_proc = block
|
17
|
+
end
|
18
|
+
|
19
|
+
def merge(hash)
|
20
|
+
@bus_data.merge(id, hash, &@merge_proc)
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_h
|
24
|
+
@bus_data.to_h[id.to_s]
|
25
|
+
end
|
26
|
+
|
27
|
+
def on_finished(&block)
|
28
|
+
@finished = block
|
29
|
+
end
|
30
|
+
|
31
|
+
def wait_for_expected_agents(max_tries=0)
|
32
|
+
if @expected_agents
|
33
|
+
puts "AGENTS: #{@bus_data.active_agents} EXPECTED: #{@expected_agents}"
|
34
|
+
loop do
|
35
|
+
break if (@bus_data.active_agents == @expected_agents.to_i) || (max_tries == 5)
|
36
|
+
sleep 1
|
37
|
+
max_tries += 1
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def finish!(end_time = DateTime.now)
|
43
|
+
@end_time = end_time
|
44
|
+
@finished&.call(to_h)
|
45
|
+
if last
|
46
|
+
@bus.finished&.call(@bus_data.to_h)
|
47
|
+
@bus_data.teardown_bus
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def last
|
54
|
+
teardown!.zero?
|
55
|
+
end
|
56
|
+
|
57
|
+
def teardown!
|
58
|
+
@bus_data.teardown_agent
|
59
|
+
end
|
60
|
+
|
61
|
+
def setup!
|
62
|
+
@bus_data.setup_agent
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "redis"
|
2
|
+
require "date"
|
3
|
+
require "json"
|
4
|
+
require_relative "./agent"
|
5
|
+
require_relative "./bus_data"
|
6
|
+
|
7
|
+
module DoubleDecker
|
8
|
+
class Bus
|
9
|
+
attr_reader :run_id, :expected_agents, :finished
|
10
|
+
|
11
|
+
def initialize(run_id, url: "redis://localhost", expected_agents: nil, redis: Redis.new(url: url))
|
12
|
+
@store = redis
|
13
|
+
@run_id = run_id
|
14
|
+
@expected_agents = expected_agents
|
15
|
+
setup!
|
16
|
+
end
|
17
|
+
|
18
|
+
def register(&merge_proc)
|
19
|
+
agent = Agent.new(self, BusData.new(run_id, @store), expected_agents, merge_proc: merge_proc)
|
20
|
+
agent.wait_for_expected_agents
|
21
|
+
agent
|
22
|
+
end
|
23
|
+
|
24
|
+
def on_finished(&block)
|
25
|
+
@finished = block
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
def setup!
|
31
|
+
@store.get(run_id) || @store.set(run_id, {}.to_json)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require "json"
|
2
|
+
|
3
|
+
module DoubleDecker
|
4
|
+
class BusData
|
5
|
+
attr_reader :run_id, :store
|
6
|
+
|
7
|
+
def initialize(run_id, store)
|
8
|
+
@run_id = run_id
|
9
|
+
@store = store
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_h
|
13
|
+
data = store.get(run_id)
|
14
|
+
data && JSON.parse(data)
|
15
|
+
end
|
16
|
+
|
17
|
+
def setup_agent
|
18
|
+
store.incr("#{run_id}_agents").to_i
|
19
|
+
end
|
20
|
+
|
21
|
+
def teardown_bus
|
22
|
+
store.del(run_id)
|
23
|
+
store.del("#{run_id}_agents")
|
24
|
+
end
|
25
|
+
|
26
|
+
def teardown_agent
|
27
|
+
store.decr("#{run_id}_agents").to_i
|
28
|
+
end
|
29
|
+
|
30
|
+
def active_agents
|
31
|
+
store.get("#{run_id}_agents").to_i
|
32
|
+
end
|
33
|
+
|
34
|
+
def merge(agent_id, hash, &block)
|
35
|
+
block.call(hash) if block
|
36
|
+
data = to_h || {}
|
37
|
+
data[agent_id.to_s] ||= {}
|
38
|
+
data[agent_id.to_s].merge!(hash)
|
39
|
+
store.set(run_id, data.to_json)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: double_decker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Gregory
|
@@ -17,6 +17,9 @@ extensions: []
|
|
17
17
|
extra_rdoc_files: []
|
18
18
|
files:
|
19
19
|
- src/double_decker.rb
|
20
|
+
- src/double_decker/agent.rb
|
21
|
+
- src/double_decker/bus.rb
|
22
|
+
- src/double_decker/bus_data.rb
|
20
23
|
homepage: https://rubygems.org/gems/double_decker
|
21
24
|
licenses:
|
22
25
|
- MIT
|