robot-controller 0.3.0 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -11,7 +11,6 @@ In your `Gemfile`, add:
11
11
 
12
12
  In your `Rakefile`, add the following (if you don't want to include the environment unconditionally):
13
13
 
14
- require 'resque/tasks'
15
14
  require 'robot-controller/tasks'
16
15
 
17
16
  Create the following configuration files based on the examples in `example/config`:
@@ -36,11 +35,11 @@ controller, then add:
36
35
  Example:
37
36
  % controller boot # start bluepilld and jobs
38
37
  % controller status # check on status of jobs
39
- % controller log dor_accessionWF_descriptive-metadata # view log for worker
38
+ % controller log 1_dor_accessionWF_descriptive-metadata # view log for worker
40
39
  % controller stop # stop jobs
41
40
  % controller quit # stop bluepilld
42
41
 
43
42
  Environment:
44
43
  BLUEPILL_BASEDIR - where bluepill stores its state (default: run/bluepill)
45
44
  BLUEPILL_LOGFILE - output log (default: log/bluepill.log)
46
- ROBOT_ENVIRONMENT - (default: development)
45
+ ROBOT_ENVIRONMENT - (default: development)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.3.2
@@ -12,7 +12,7 @@ Example:
12
12
  % controller log dor_accessionWF_descriptive-metadata # view log for worker
13
13
  % controller stop # stop jobs
14
14
  % controller quit # stop bluepilld
15
-
15
+
16
16
  Environment:
17
17
  BLUEPILL_BASEDIR - where bluepill stores its state (default: run/bluepill)
18
18
  BLUEPILL_LOGFILE - output log (default: log/bluepill.log)
@@ -38,11 +38,12 @@ if ARGV[0] == 'boot'
38
38
  end
39
39
  if File.file?(fn)
40
40
  puts "Loading #{fn}"
41
- system "#{cmd} load #{fn}"
42
- exit 0
41
+ exec "#{cmd} load #{fn}"
42
+ # NOTREACHED
43
43
  end
44
44
  puts "ERROR: Cannot find bluepill configuration file for #{ENV['ROBOT_ENVIRONMENT']}"
45
45
  exit -1
46
46
  else
47
- system "#{cmd} #{ARGV.join(' ')}"
47
+ exec "#{cmd} #{ARGV.join(' ')}"
48
+ # NOTREACHED
48
49
  end
@@ -9,78 +9,77 @@
9
9
  # where
10
10
  # 1. robot is a single robot identifier (fully-qualified with
11
11
  # REPO_SUITE_ROBOT, e.g., "dor_accessionWF_technical-metadata").
12
- # 2. lane is a single integer (4), a range (3-5), or a list (2,4,8),
13
- # or an asterix (*).
12
+ # 2. lane is
13
+ # - a single identifier ('A'), or
14
+ # - a list of identiers ('A,B,C'), or
15
+ # - an asterix (*).
14
16
  # 3. instances is a single integer.
15
17
  #
16
- # Both lane and instances are optional. Lane defaults to *, and
18
+ # Both lane and instances are optional. Lane defaults to 'default', and
17
19
  # instances defaults to 1.
18
20
  #
19
21
  # When a robot is allocated to multiple lanes, it reads them in
20
- # PRIORITY ORDER. That is, if a robot is listening to lanes 1, 2, and 3,
21
- # it works on lane 1 until empty, then lane 2 until empty, and then
22
- # lane 3 until empty. In the meantime, if a job comes in on a faster
22
+ # PRIORITY ORDER. That is, if a robot is listening to lanes A, B, and C,
23
+ # it works on lane A until empty, then lane B until empty, and then
24
+ # lane C until empty. In the meantime, if a job comes in on a 'faster'
23
25
  # lane, it works on that after finishing it's current job (i.e., after
24
- # working on a job in lane 3, if a job comes in on lane 1 in the intermin,
25
- # the robot will work on the lane 1 job next before returning to lane 3).
26
- #
27
- # In general, lanes 1-5 are reserved for priority queues, and lanes 6-N
28
- # are dedicated lanes.
26
+ # working on a job in lane C, if a job comes in on lane A in the intermin,
27
+ # the robot will work on the lane A job next before returning to lane C).
28
+ # When using an asterix for the lane designator, the lanes are processed
29
+ # in alphabetical order.
29
30
  #
30
31
  # Note that the syntax is YAML, so the lists must not contain spaces or
31
32
  # needs to be quoted.
32
33
  #
33
34
  # RIGHT
34
- # - dor_accessionWF_technical-metadata:10:5
35
- # - 'dor_accessionWF_technical-metadata : 10 : 5'
35
+ # - dor_accessionWF_technical-metadata:A:5
36
+ # - 'dor_accessionWF_technical-metadata : A : 5'
36
37
  #
37
38
  # WRONG
38
- # - dor_accessionWF_technical-metadata : 10 : 5
39
- # - dor_accessionWF_technical-metadata: 10: 5
39
+ # - dor_accessionWF_technical-metadata : A : 5
40
+ # - dor_accessionWF_technical-metadata: A: 5
40
41
  #
41
42
 
42
43
  #
43
44
  # Robot 1 (8 CPU) hosts shelving and publish only
44
45
  #
45
46
  sul-robots1-dev:
47
+ - dor_accessionWF_shelve:A # 1 robot for lane A
48
+ - dor_accessionWF_shelve:B:3 # 3 robots for lane B
49
+ - dor_accessionWF_shelve:C:3 # 3 robots for lane C
50
+ - dor_accessionWF_shelve:D:3 # 3 robots for lane D
51
+ - dor_accessionWF_shelve:E:3 # 3 robots for lane E
46
52
  - dor_accessionWF_shelve:*:3 # 3 robots for all lanes
47
- - dor_accessionWF_shelve:6:3 # 3 robots for lane 6
48
- - dor_accessionWF_shelve:7:3 # 3 robots for lane 7
49
- - dor_accessionWF_shelve:8:3 # 3 robots for lane 8
50
- - dor_accessionWF_shelve:9:3 # 3 robots for lane 9
51
- - dor_accessionWF_shelve:10:3 # 3 robots for lane 10
52
- - dor_accessionWF_publish:1-5:3 # 3 robots for lanes 1 through 5
53
- - dor_accessionWF_publish:6:3 # 3 robots for lane 6
54
- - dor_accessionWF_publish:7:3 # 3 robots for lane 7
55
- - dor_accessionWF_publish:8:3 # 3 robots for lane 8
56
- - dor_accessionWF_publish:9:3 # 3 robots for lane 9
57
- - dor_accessionWF_publish:10:3 # 3 robots for lane 10
58
- - dor_accessionWF_publish:6,9 # 1 robot for lane 6 and 9
53
+ - dor_accessionWF_shelve::3 # 3 robots for default lane
54
+ - dor_accessionWF_publish:A,C:3 # 3 robots for lanes A and C
55
+ - dor_accessionWF_publish:B,D,E # 1 robot for lanes B, D and E
56
+ - dor_accessionWF_descriptive-metadata # 1 robot for all lanes
57
+ - dor_accessionWF_rights-metadata # 1 robot for all lanes
58
+ - dor_accessionWF_content-metadata # 1 robot for all lanes
59
+ - dor_accessionWF_remediate-object # 1 robot for all lanes
60
+ - dor_accessionWF_provenance-metadata # 1 robot for all lanes
61
+ - dor_accessionWF_sdr-ingest-transfer # 1 robot for all lanes
62
+ - dor_accessionWF_end-accession # 1 robot for all lanes
59
63
 
60
64
  #
61
65
  # Robot 2 (16 CPU) hosts technical metadata creation only
62
66
  #
63
67
  sul-robots2-dev:
64
- - dor_accessionWF_technical-metadata:1:5 # 5 robots for lane 1
65
- - dor_accessionWF_technical-metadata:2:5 # 5 robots for lane 2
66
- - dor_accessionWF_technical-metadata:3-5:5 # 5 robots for lanes 3, 4, 5
67
- - dor_accessionWF_technical-metadata:6:2 # 2 robots for lane 6
68
- - dor_accessionWF_technical-metadata:7:2 # 2 robots for lane 7
69
- - dor_accessionWF_technical-metadata:8:2 # 2 robots for lane 8
70
- - dor_accessionWF_technical-metadata:9:2 # 2 robots for lane 9
71
- - dor_accessionWF_technical-metadata:10:2 # 2 robots for lane 10
68
+ - dor_accessionWF_technical-metadata:A:5 # 5 robots for lane A
69
+ - dor_accessionWF_technical-metadata:B:5 # 5 robots for lane B
70
+ - dor_accessionWF_technical-metadata:C,D,E:5 # 5 robots for lanes C, D, and E
72
71
 
73
72
  #
74
73
  # Robot 3 (4 CPU) hosts helper robots for all accessioning workflows
75
74
  #
76
75
  sul-robots3-dev:
77
- - dor_accessionWF_descriptive-metadata # 1 robot for all lanes
78
- - dor_accessionWF_rights-metadata # 1 robot for all lanes
79
- - dor_accessionWF_content-metadata # 1 robot for all lanes
80
- - dor_accessionWF_technical-metadata # 1 robot for all lanes
81
- - dor_accessionWF_remediate-object # 1 robot for all lanes
82
- - dor_accessionWF_shelve:*:5 # 5 robots for all lanes
83
- - dor_accessionWF_publish:*:10 # 10 robots for all lanes
84
- - dor_accessionWF_provenance-metadata # 1 robot for all lanes
85
- - dor_accessionWF_sdr-ingest-transfer # 1 robot for all lanes
86
- - dor_accessionWF_end-accession # 1 robot for all lanes
76
+ - dor_accessionWF_descriptive-metadata # 1 robot for default lane
77
+ - dor_accessionWF_rights-metadata # 1 robot for default lane
78
+ - dor_accessionWF_content-metadata # 1 robot for default lane
79
+ - dor_accessionWF_technical-metadata # 1 robot for default lane
80
+ - dor_accessionWF_remediate-object # 1 robot for default lane
81
+ - dor_accessionWF_shelve # 1 robot for default lane
82
+ - dor_accessionWF_publish # 1 robot for default lane
83
+ - dor_accessionWF_provenance-metadata # 1 robot for default lane
84
+ - dor_accessionWF_sdr-ingest-transfer # 1 robot for default lane
85
+ - dor_accessionWF_end-accession # 1 robot for default lane
@@ -2,7 +2,6 @@ require 'yaml'
2
2
 
3
3
  class RobotConfigParser
4
4
  ROBOT_INSTANCE_MAX = 16
5
- LANE_INSTANCE_MAX = 99 # sprintf("%02d") maximum
6
5
 
7
6
  # parse_instances(1) == 1
8
7
  # parse_instances(16) == 16
@@ -16,54 +15,27 @@ class RobotConfigParser
16
15
  n
17
16
  end
18
17
 
18
+ # parse_lanes('') == ['default']
19
+ # parse_lanes(' ') == ['default']
20
+ # parse_lanes(' , ') == ['default']
21
+ # parse_lanes(' , ,') == ['default']
19
22
  # parse_lanes('*') == ['*']
20
- # parse_lanes('0') == [0]
21
- # parse_lanes('1') == [1]
22
- # parse_lanes('1-5') == [1,2,3,4,5]
23
- # parse_lanes('1,2,3') == [1,2,3]
24
- # parse_lanes('1-5,8') == [1,2,3,4,5,8]
25
- # parse_lanes('-1') == [0, 1]
26
- # parse_lanes('100') == RuntimeException
23
+ # parse_lanes('1') == ['1']
24
+ # parse_lanes('A') == ['A']
25
+ # parse_lanes('A , B') == ['A', 'B']
26
+ # parse_lanes('A,B,C') == ['A','B','C']
27
+ # parse_lanes('A-C,E') == ['A-C', 'E']
27
28
  def parse_lanes(lanes_spec)
28
- lanes = []
29
-
30
- # parse each comma-seperated specification
31
- lanes_spec.split(/,/).each do |i|
32
- # this is a range element
33
- if i =~ /-/
34
- x = i.split(/-/)
35
- Range.new(x[0].to_i, x[1].to_i).each do |j|
36
- lanes << j
37
- end
38
- # a wildcard
39
- elsif i == '*'
40
- lanes << '*'
41
- # simple integer
42
- else
43
- lanes << i.to_i
44
- end
45
- end
46
-
47
- # verify that lanes are all within 1 .. LANE_INSTANCE_MAX
48
- lanes.each do |j|
49
- if j.is_a?(Integer)
50
- if j > LANE_INSTANCE_MAX
51
- raise RuntimeError, "SyntaxError: Lane #{j} > #{LANE_INSTANCE_MAX}"
52
- elsif j < 0
53
- raise RuntimeError, "SyntaxError: Lane #{j} < 0"
54
- end
55
- end
56
- end
57
- lanes
29
+ return ['default'] if lanes_spec.split(/,/).collect {|l| l.strip}.join('') == ''
30
+ lanes_spec.split(/,/).collect {|l| l.strip }
58
31
  end
59
32
 
60
- # build_queues('a','1') => ['a_01']
61
- # build_queues('a','1,3') => ['a_01', 'a_03']
62
- # build_queues('a','1-3') => ['a_01', 'a_02', 'a_03']
33
+ # build_queues('z','A') => ['z_A']
34
+ # build_queues('z','A,C') => ['z_A', 'z_C']
63
35
  def build_queues(robot, lanes)
64
36
  queues = []
65
37
  parse_lanes(lanes).each do |i|
66
- queues << [robot, i == '*' ? '*' : sprintf("%02d", i)].join('_')
38
+ queues << [robot, i].join('_')
67
39
  end
68
40
  queues
69
41
  end
@@ -92,7 +64,7 @@ class RobotConfigParser
92
64
  # parse YAML lines for host where i is robot[:lane[:instances]]
93
65
  r = []
94
66
  robots[host].each do |i|
95
- robot = i.split(/:/)
67
+ robot = i.split(/:/).collect {|j| j.strip}
96
68
  robot.each do |j|
97
69
  if j.strip == ''
98
70
  raise RuntimeError, "SyntaxError: #{i}"
@@ -1,3 +1,5 @@
1
+ require 'resque/tasks'
2
+
1
3
  desc "Start multiple Resque workers using environment"
2
4
  task :workers => [ :environment ] do
3
5
  threads = []
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
23
23
  s.required_rubygems_version = ">= 1.3.6"
24
24
 
25
25
  s.add_dependency 'bluepill', '~> 0.0.67'
26
+ s.add_dependency 'resque', '~> 1.25.2'
26
27
 
27
28
  s.add_development_dependency 'awesome_print'
28
29
  s.add_development_dependency 'pry'
metadata CHANGED
@@ -1,18 +1,20 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: robot-controller
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.2
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Darren Hardy
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2014-05-19 00:00:00.000000000 Z
12
+ date: 2014-06-06 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: bluepill
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
19
  - - ~>
18
20
  - !ruby/object:Gem::Version
@@ -20,92 +22,121 @@ dependencies:
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
27
  - - ~>
25
28
  - !ruby/object:Gem::Version
26
29
  version: 0.0.67
30
+ - !ruby/object:Gem::Dependency
31
+ name: resque
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 1.25.2
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 1.25.2
27
46
  - !ruby/object:Gem::Dependency
28
47
  name: awesome_print
29
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
30
50
  requirements:
31
- - - '>='
51
+ - - ! '>='
32
52
  - !ruby/object:Gem::Version
33
53
  version: '0'
34
54
  type: :development
35
55
  prerelease: false
36
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
37
58
  requirements:
38
- - - '>='
59
+ - - ! '>='
39
60
  - !ruby/object:Gem::Version
40
61
  version: '0'
41
62
  - !ruby/object:Gem::Dependency
42
63
  name: pry
43
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
44
66
  requirements:
45
- - - '>='
67
+ - - ! '>='
46
68
  - !ruby/object:Gem::Version
47
69
  version: '0'
48
70
  type: :development
49
71
  prerelease: false
50
72
  version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
51
74
  requirements:
52
- - - '>='
75
+ - - ! '>='
53
76
  - !ruby/object:Gem::Version
54
77
  version: '0'
55
78
  - !ruby/object:Gem::Dependency
56
79
  name: rake
57
80
  requirement: !ruby/object:Gem::Requirement
81
+ none: false
58
82
  requirements:
59
- - - '>='
83
+ - - ! '>='
60
84
  - !ruby/object:Gem::Version
61
85
  version: '0'
62
86
  type: :development
63
87
  prerelease: false
64
88
  version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
65
90
  requirements:
66
- - - '>='
91
+ - - ! '>='
67
92
  - !ruby/object:Gem::Version
68
93
  version: '0'
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: redcarpet
71
96
  requirement: !ruby/object:Gem::Requirement
97
+ none: false
72
98
  requirements:
73
- - - '>='
99
+ - - ! '>='
74
100
  - !ruby/object:Gem::Version
75
101
  version: '0'
76
102
  type: :development
77
103
  prerelease: false
78
104
  version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
79
106
  requirements:
80
- - - '>='
107
+ - - ! '>='
81
108
  - !ruby/object:Gem::Version
82
109
  version: '0'
83
110
  - !ruby/object:Gem::Dependency
84
111
  name: version_bumper
85
112
  requirement: !ruby/object:Gem::Requirement
113
+ none: false
86
114
  requirements:
87
- - - '>='
115
+ - - ! '>='
88
116
  - !ruby/object:Gem::Version
89
117
  version: '0'
90
118
  type: :development
91
119
  prerelease: false
92
120
  version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
93
122
  requirements:
94
- - - '>='
123
+ - - ! '>='
95
124
  - !ruby/object:Gem::Version
96
125
  version: '0'
97
126
  - !ruby/object:Gem::Dependency
98
127
  name: yard
99
128
  requirement: !ruby/object:Gem::Requirement
129
+ none: false
100
130
  requirements:
101
- - - '>='
131
+ - - ! '>='
102
132
  - !ruby/object:Gem::Version
103
133
  version: '0'
104
134
  type: :development
105
135
  prerelease: false
106
136
  version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
107
138
  requirements:
108
- - - '>='
139
+ - - ! '>='
109
140
  - !ruby/object:Gem::Version
110
141
  version: '0'
111
142
  description:
@@ -136,26 +167,27 @@ homepage: http://github.com/sul-dlss/robot-controller
136
167
  licenses:
137
168
  - ALv2
138
169
  - Stanford University
139
- metadata: {}
140
170
  post_install_message:
141
171
  rdoc_options: []
142
172
  require_paths:
143
173
  - lib
144
174
  required_ruby_version: !ruby/object:Gem::Requirement
175
+ none: false
145
176
  requirements:
146
- - - '>='
177
+ - - ! '>='
147
178
  - !ruby/object:Gem::Version
148
179
  version: '0'
149
180
  required_rubygems_version: !ruby/object:Gem::Requirement
181
+ none: false
150
182
  requirements:
151
- - - '>='
183
+ - - ! '>='
152
184
  - !ruby/object:Gem::Version
153
185
  version: 1.3.6
154
186
  requirements: []
155
187
  rubyforge_project:
156
- rubygems_version: 2.2.2
188
+ rubygems_version: 1.8.25
157
189
  signing_key:
158
- specification_version: 4
190
+ specification_version: 3
159
191
  summary: Monitors and controls running workflow robots off of priority queues and
160
192
  within a cluster
161
193
  test_files: []
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: c01c2e8362bea0af35c415127c35e2b6fd5a643d
4
- data.tar.gz: 3bea75dfaa22001504e2a7db019ae406e4b81c00
5
- SHA512:
6
- metadata.gz: e4c6de1781095edee97a52db140f4e6b9e7ca538ccaf66982ef0ce7f50467e2a998ac8c37334bc89fabd58dfe0420a7eb66604b51e593effd6a6870655f6bcf4
7
- data.tar.gz: cc1b11f2655f960195a56ce760d19ebc39babd02e797002b19dce8ad3c4336213f2bb7a8ce7ad8b736ece255a259b2cf47db832fd1fcc2ffe4b8751dcc12160e