radagast 0.0.1.pre.dev → 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/rabbit-restart.sh +16 -0
- data/bin/rabbit-stop.sh +4 -0
- data/bin/radagast +11 -1
- data/lib/radagast/config.rb +22 -0
- data/lib/radagast/manager.rb +58 -0
- data/lib/radagast/rabbit_helper.rb +38 -0
- data/lib/radagast/result.rb +3 -0
- data/lib/radagast/worker.rb +38 -0
- data/lib/radagast.rb +4 -0
- metadata +29 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 560f233b948a123e0fb646dceeb36fcb04d59e70
|
4
|
+
data.tar.gz: 708db7870f7d5d310bc9075bd5a410d2e3892b1c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 625289d4021c881f27e268fe41f202e02bddb279bb9cbdf7426444440382bc28d7f14964074c3d7811120b1e1bcfeb86ed46951d41fe378af41876017c9197b2
|
7
|
+
data.tar.gz: bcdd6fabb52f4dee4e4fa2aeae653ca6059554011cc41f410ced512b9d4ebb141012e98117b378b3b9be92eea7e2717bf270f3c1def0403f85857bfd8e2c70ae
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
docker stop rabbit-radagast
|
4
|
+
docker rm rabbit-radagast
|
5
|
+
|
6
|
+
docker run -d \
|
7
|
+
--hostname rabbit-radagast \
|
8
|
+
--name rabbit-radagast \
|
9
|
+
-p 5672:5672 \
|
10
|
+
-p 15672:15672 \
|
11
|
+
-e RABBITMQ_ERLANG_COOKIE='radagast' \
|
12
|
+
rabbitmq:3
|
13
|
+
|
14
|
+
sleep 3
|
15
|
+
docker exec rabbit-radagast rabbitmq-plugins enable rabbitmq_management
|
16
|
+
docker restart rabbit-radagast
|
data/bin/rabbit-stop.sh
ADDED
data/bin/radagast
CHANGED
@@ -1,3 +1,13 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
3
|
+
require_relative '../lib/radagast/config'
|
4
|
+
require_relative '../lib/radagast/worker'
|
5
|
+
|
6
|
+
config = Radagast::Config.parse_argv
|
7
|
+
worker = Radagast::Worker.new config
|
8
|
+
|
9
|
+
begin
|
10
|
+
worker.start
|
11
|
+
rescue SystemExit, Interrupt
|
12
|
+
worker.finish
|
13
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
module Radagast
|
5
|
+
Config = Struct.new(:key, :rabbit, :log_level) do
|
6
|
+
def initialize
|
7
|
+
self.key = 'default'
|
8
|
+
self.rabbit = 'amqp://guest:guest@127.0.0.1:5672'
|
9
|
+
self.log_level = Logger::UNKNOWN
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.parse_argv(argv = ARGV)
|
13
|
+
config = new
|
14
|
+
OptionParser.new do |opt|
|
15
|
+
opt.on('--key KEY') { |o| config.key = o }
|
16
|
+
opt.on('--rabbit RABBIT') { |o| config.rabbit = o }
|
17
|
+
opt.on('--log_level LOG_LEVEL') { |o| config.log_level = const_get(o) }
|
18
|
+
end.parse!(argv)
|
19
|
+
config
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require_relative 'config'
|
2
|
+
require_relative 'rabbit_helper'
|
3
|
+
require_relative 'result'
|
4
|
+
|
5
|
+
module Radagast
|
6
|
+
# Dispatches tasks and aggregates the results
|
7
|
+
class Manager < RabbitHelper
|
8
|
+
def initialize(config)
|
9
|
+
super(
|
10
|
+
queue_name: "results-#{config.key}",
|
11
|
+
routing_key: "tasks-#{config.key}",
|
12
|
+
config: config
|
13
|
+
)
|
14
|
+
@callbacks = {}
|
15
|
+
@processed_cnt = 0
|
16
|
+
@published_cnt = 0
|
17
|
+
@all_results = []
|
18
|
+
end
|
19
|
+
|
20
|
+
def task(cmd, &blk)
|
21
|
+
logger.info 'Publishing task'
|
22
|
+
@published_cnt += 1
|
23
|
+
@callbacks[cmd] = blk
|
24
|
+
publish(cmd: cmd)
|
25
|
+
end
|
26
|
+
|
27
|
+
def process_callback(data)
|
28
|
+
logger.info "Result #{@processed_cnt}/#{@published_cnt} is here: #{data}"
|
29
|
+
result = Result.new
|
30
|
+
result.exit_code = data['exitstatus']
|
31
|
+
result.stderr = data['stderr'].strip
|
32
|
+
result.stdout = data['stdout'].strip
|
33
|
+
result.meta = { cmd: data['cmd'] }
|
34
|
+
@callbacks[data['cmd']].call result
|
35
|
+
end
|
36
|
+
|
37
|
+
def finish
|
38
|
+
logger.info 'Finishing manager'
|
39
|
+
@t.join
|
40
|
+
yield @all_results if block_given?
|
41
|
+
end
|
42
|
+
|
43
|
+
def start
|
44
|
+
@t = Thread.new do
|
45
|
+
logger.info 'Manager subscribe to results queue'
|
46
|
+
subscribe do |data|
|
47
|
+
@processed_cnt += 1
|
48
|
+
process_callback data
|
49
|
+
@all_results << data
|
50
|
+
if @processed_cnt == @published_cnt
|
51
|
+
logger.info "All #{@processed_cnt} messages have been processed"
|
52
|
+
cleanup
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'bunny'
|
2
|
+
require 'json'
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
module Radagast
|
6
|
+
# Wraps RabbitMQ internals to provide simple API to Worker and Manager
|
7
|
+
class RabbitHelper
|
8
|
+
attr_reader :logger
|
9
|
+
|
10
|
+
def initialize(queue_name:, routing_key:, config:)
|
11
|
+
@rabbit = Bunny.new config.rabbit
|
12
|
+
@rabbit.start
|
13
|
+
@routing_key = routing_key
|
14
|
+
@channel = @rabbit.create_channel
|
15
|
+
@exchange = @channel.default_exchange
|
16
|
+
@queue = @channel.queue(queue_name, auto_delete: true)
|
17
|
+
@logger = Logger.new(STDOUT)
|
18
|
+
@logger.level = config.log_level
|
19
|
+
end
|
20
|
+
|
21
|
+
def cleanup
|
22
|
+
@rabbit.close
|
23
|
+
end
|
24
|
+
|
25
|
+
def publish(data)
|
26
|
+
logger.info "publishing #{data}"
|
27
|
+
@exchange.publish(JSON.generate(data), routing_key: @routing_key)
|
28
|
+
end
|
29
|
+
|
30
|
+
def subscribe
|
31
|
+
@queue.subscribe(block: true) do |_delivery_info, _metadata, payload|
|
32
|
+
data = JSON.parse(payload)
|
33
|
+
logger.info "processing #{data}"
|
34
|
+
yield data
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'open3'
|
3
|
+
|
4
|
+
require_relative 'config'
|
5
|
+
require_relative 'rabbit_helper'
|
6
|
+
|
7
|
+
module Radagast
|
8
|
+
# Fetches the task, processes it and returns the result
|
9
|
+
class Worker < RabbitHelper
|
10
|
+
def initialize(config)
|
11
|
+
super(
|
12
|
+
queue_name: "tasks-#{config.key}",
|
13
|
+
routing_key: "results-#{config.key}",
|
14
|
+
config: config
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
def start
|
19
|
+
logger.info 'Worker setup, subscribing to tasks queue'
|
20
|
+
subscribe do |data|
|
21
|
+
stdout, stderr, status = Open3.capture3(data['cmd'])
|
22
|
+
response = {
|
23
|
+
cmd: data['cmd'],
|
24
|
+
meta: data['meta'],
|
25
|
+
stdout: stdout,
|
26
|
+
stderr: stderr,
|
27
|
+
exitstatus: status.exitstatus
|
28
|
+
}
|
29
|
+
publish(response)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def finish
|
34
|
+
logger.info 'Finishing worker'
|
35
|
+
cleanup
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/lib/radagast.rb
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: radagast
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.1
|
4
|
+
version: 0.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bartek Wilczek
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-11-
|
11
|
+
date: 2017-11-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bunny
|
@@ -24,15 +24,38 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '2.6'
|
27
|
-
|
28
|
-
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.7'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.7'
|
41
|
+
description: |-
|
42
|
+
Use docker swarm and rabbitmq to distribute tasks. \
|
43
|
+
Designed for faster test execution.
|
29
44
|
email: bwilczek@gmail.com
|
30
45
|
executables:
|
31
46
|
- radagast
|
32
47
|
extensions: []
|
33
48
|
extra_rdoc_files: []
|
34
49
|
files:
|
50
|
+
- bin/rabbit-restart.sh
|
51
|
+
- bin/rabbit-stop.sh
|
35
52
|
- bin/radagast
|
53
|
+
- lib/radagast.rb
|
54
|
+
- lib/radagast/config.rb
|
55
|
+
- lib/radagast/manager.rb
|
56
|
+
- lib/radagast/rabbit_helper.rb
|
57
|
+
- lib/radagast/result.rb
|
58
|
+
- lib/radagast/worker.rb
|
36
59
|
homepage: https://github.com/bwilczek/radagast
|
37
60
|
licenses:
|
38
61
|
- MIT
|
@@ -48,9 +71,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
48
71
|
version: '2.0'
|
49
72
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
73
|
requirements:
|
51
|
-
- - "
|
74
|
+
- - ">="
|
52
75
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
76
|
+
version: '0'
|
54
77
|
requirements: []
|
55
78
|
rubyforge_project:
|
56
79
|
rubygems_version: 2.6.8
|