radagast 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 560f233b948a123e0fb646dceeb36fcb04d59e70
4
- data.tar.gz: 708db7870f7d5d310bc9075bd5a410d2e3892b1c
3
+ metadata.gz: 3a3aeecf960c69e2b139b0c8a3768ea662617742
4
+ data.tar.gz: f822537df36098ae47ee5b887375bbbce4273e1d
5
5
  SHA512:
6
- metadata.gz: 625289d4021c881f27e268fe41f202e02bddb279bb9cbdf7426444440382bc28d7f14964074c3d7811120b1e1bcfeb86ed46951d41fe378af41876017c9197b2
7
- data.tar.gz: bcdd6fabb52f4dee4e4fa2aeae653ca6059554011cc41f410ced512b9d4ebb141012e98117b378b3b9be92eea7e2717bf270f3c1def0403f85857bfd8e2c70ae
6
+ metadata.gz: 500012876ff082a92f70ffe389fc0a4f4cb033842d5be517b5cdd2c7e02dcdb9a24d3cb174c1ae4938ceb6e859b6085cdac947fb1340baacfa348c8228f27c0c
7
+ data.tar.gz: 2637232e4857d35172b31a7a178f8d9dc84153c4cd805bddb65bb170bf75688029b80cbe7666526aa2f3783e3f512bec51f79eb92c49cf262d512ed364cb438f
@@ -2,11 +2,12 @@ require 'optparse'
2
2
  require 'logger'
3
3
 
4
4
  module Radagast
5
- Config = Struct.new(:key, :rabbit, :log_level) do
5
+ Config = Struct.new(:key, :rabbit, :log_level, :log_file) do
6
6
  def initialize
7
7
  self.key = 'default'
8
8
  self.rabbit = 'amqp://guest:guest@127.0.0.1:5672'
9
- self.log_level = Logger::UNKNOWN
9
+ self.log_level = Logger::INFO
10
+ self.log_file = STDOUT
10
11
  end
11
12
 
12
13
  def self.parse_argv(argv = ARGV)
@@ -15,6 +16,7 @@ module Radagast
15
16
  opt.on('--key KEY') { |o| config.key = o }
16
17
  opt.on('--rabbit RABBIT') { |o| config.rabbit = o }
17
18
  opt.on('--log_level LOG_LEVEL') { |o| config.log_level = const_get(o) }
19
+ opt.on('--log_file LOG_FILE') { |o| config.log_file = o }
18
20
  end.parse!(argv)
19
21
  config
20
22
  end
@@ -1,3 +1,5 @@
1
+ require 'securerandom'
2
+
1
3
  require_relative 'config'
2
4
  require_relative 'rabbit_helper'
3
5
  require_relative 'result'
@@ -5,7 +7,7 @@ require_relative 'result'
5
7
  module Radagast
6
8
  # Dispatches tasks and aggregates the results
7
9
  class Manager < RabbitHelper
8
- def initialize(config)
10
+ def initialize(config = Radagast::Config.new)
9
11
  super(
10
12
  queue_name: "results-#{config.key}",
11
13
  routing_key: "tasks-#{config.key}",
@@ -17,21 +19,12 @@ module Radagast
17
19
  @all_results = []
18
20
  end
19
21
 
20
- def task(cmd, &blk)
22
+ def task(cmd, meta = {}, &blk)
21
23
  logger.info 'Publishing task'
22
24
  @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
25
+ task_id = SecureRandom.uuid
26
+ @callbacks[task_id] = blk if block_given?
27
+ publish(cmd: cmd, meta: meta, task_id: task_id)
35
28
  end
36
29
 
37
30
  def finish
@@ -45,8 +38,9 @@ module Radagast
45
38
  logger.info 'Manager subscribe to results queue'
46
39
  subscribe do |data|
47
40
  @processed_cnt += 1
48
- process_callback data
49
- @all_results << data
41
+ result = Result.from_hash data
42
+ process_callback result
43
+ @all_results << result
50
44
  if @processed_cnt == @published_cnt
51
45
  logger.info "All #{@processed_cnt} messages have been processed"
52
46
  cleanup
@@ -54,5 +48,12 @@ module Radagast
54
48
  end
55
49
  end
56
50
  end
51
+
52
+ private
53
+
54
+ def process_callback(result)
55
+ logger.info "Result #{@processed_cnt}/#{@published_cnt} : #{result}"
56
+ @callbacks[result.task_id].call(result) if @callbacks.key? result.task_id
57
+ end
57
58
  end
58
59
  end
@@ -14,7 +14,7 @@ module Radagast
14
14
  @channel = @rabbit.create_channel
15
15
  @exchange = @channel.default_exchange
16
16
  @queue = @channel.queue(queue_name, auto_delete: true)
17
- @logger = Logger.new(STDOUT)
17
+ @logger = Logger.new(config.log_file)
18
18
  @logger.level = config.log_level
19
19
  end
20
20
 
@@ -1,3 +1,13 @@
1
1
  module Radagast
2
- Result = Struct.new(:exit_code, :stdout, :stderr, :meta)
2
+ Result = Struct.new(:exit_code, :stdout, :stderr, :meta, :task_id) do
3
+ def self.from_hash(data)
4
+ o = new
5
+ o.exit_code = data['exit_code']
6
+ o.stderr = data['stderr']
7
+ o.stdout = data['stdout']
8
+ o.meta = data['meta']
9
+ o.task_id = data['task_id']
10
+ o
11
+ end
12
+ end
3
13
  end
@@ -7,7 +7,7 @@ require_relative 'rabbit_helper'
7
7
  module Radagast
8
8
  # Fetches the task, processes it and returns the result
9
9
  class Worker < RabbitHelper
10
- def initialize(config)
10
+ def initialize(config = Radagast::Config.new)
11
11
  super(
12
12
  queue_name: "tasks-#{config.key}",
13
13
  routing_key: "results-#{config.key}",
@@ -16,15 +16,15 @@ module Radagast
16
16
  end
17
17
 
18
18
  def start
19
- logger.info 'Worker setup, subscribing to tasks queue'
19
+ logger.info "Worker setup, subscribing to tasks queue #{@queue.name}"
20
20
  subscribe do |data|
21
21
  stdout, stderr, status = Open3.capture3(data['cmd'])
22
22
  response = {
23
- cmd: data['cmd'],
24
- meta: data['meta'],
25
- stdout: stdout,
26
- stderr: stderr,
27
- exitstatus: status.exitstatus
23
+ task_id: data['task_id'],
24
+ meta: data['meta'].merge(cmd: data['cmd']),
25
+ stdout: stdout.strip,
26
+ stderr: stderr.strip,
27
+ exit_code: status.exitstatus
28
28
  }
29
29
  publish(response)
30
30
  end
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.2
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-20 00:00:00.000000000 Z
11
+ date: 2017-11-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bunny
@@ -68,7 +68,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
68
68
  requirements:
69
69
  - - "~>"
70
70
  - !ruby/object:Gem::Version
71
- version: '2.0'
71
+ version: '2.2'
72
72
  required_rubygems_version: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - ">="