manband 0.7.0 → 0.8.0
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.
- data/README +1 -0
- data/bin/ackband.rb +66 -0
- data/bin/jobhandler.rb +1 -1
- data/bin/workflowhandler.rb +2 -2
- data/lib/manband/bandmanager.rb +1 -1
- data/lib/manband/flowconfig.rb +3 -0
- data/lib/manband/job.rb +12 -8
- data/lib/manband/workflow.rb +4 -1
- metadata +4 -3
data/README
CHANGED
data/bin/ackband.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'yaml'
|
3
|
+
require 'optparse'
|
4
|
+
require 'amqp'
|
5
|
+
require 'json'
|
6
|
+
require 'logger'
|
7
|
+
|
8
|
+
$:.push File.expand_path("../lib")
|
9
|
+
|
10
|
+
require 'manband/flowconfig.rb'
|
11
|
+
require 'manband/util.rb'
|
12
|
+
|
13
|
+
|
14
|
+
# The program sends a message operation to the workflow control to ack a job.
|
15
|
+
# This program does not need database credentials but needs AMQP_URL set.
|
16
|
+
# Author: Olivier Sallou <olivier.sallou@irisa.fr>
|
17
|
+
# Copyright: 2012, IRISA
|
18
|
+
|
19
|
+
|
20
|
+
log = Logger.new(STDOUT)
|
21
|
+
log.level = Logger::INFO
|
22
|
+
|
23
|
+
options = {}
|
24
|
+
|
25
|
+
optparse = OptionParser.new do|opts|
|
26
|
+
|
27
|
+
# This displays the help screen, all programs are
|
28
|
+
# assumed to have this option.
|
29
|
+
opts.on( '-h', '--help', 'Display this screen' ) do
|
30
|
+
puts opts
|
31
|
+
exit
|
32
|
+
end
|
33
|
+
|
34
|
+
options[:workflow] = nil
|
35
|
+
opts.on( '-w', '--workflow ID', 'Id of the worflow') do |id|
|
36
|
+
options[:workflow] = id
|
37
|
+
end
|
38
|
+
|
39
|
+
options[:job] = nil
|
40
|
+
opts.on( '-j', '--job ID', 'Job id') do |id|
|
41
|
+
options[:job] = id
|
42
|
+
end
|
43
|
+
|
44
|
+
options[:instance] = 0
|
45
|
+
opts.on( '-i', '--instance ID', 'Job instance number, defaults to 0') do |id|
|
46
|
+
options[:instance] = id
|
47
|
+
end
|
48
|
+
|
49
|
+
options[:handler] = 'interactive'
|
50
|
+
opts.on( '-d', '--handler NAME', 'Handler name, defaults to interactive') do |id|
|
51
|
+
options[:handler] = id
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
optparse.parse!
|
57
|
+
|
58
|
+
if options[:workflow]==nil || options[:job]==nil
|
59
|
+
puts "Missing parameter!"
|
60
|
+
exit
|
61
|
+
end
|
62
|
+
|
63
|
+
msg = '{ "workflow" : "'+options[:workflow].to_s+'" , "id" : "'+options[:job].to_s+'", "handler" : "'+options[:handler].to_s+'", "instance" : "'+options[:instance].to_s+'" }'
|
64
|
+
|
65
|
+
Utils.publish('manband.master',{ "operation" => "finish", "msg" => msg })
|
66
|
+
|
data/bin/jobhandler.rb
CHANGED
data/bin/workflowhandler.rb
CHANGED
@@ -30,7 +30,7 @@ require 'manband/job.rb'
|
|
30
30
|
require 'manband/bandmanager.rb'
|
31
31
|
|
32
32
|
log = Logger.new(STDOUT)
|
33
|
-
log.level = Logger::
|
33
|
+
log.level = Logger::INFO
|
34
34
|
|
35
35
|
|
36
36
|
@@options = {}
|
@@ -164,7 +164,7 @@ EventMachine.run do
|
|
164
164
|
if myjob.status == STATUS_SKIP
|
165
165
|
doSkip = true
|
166
166
|
end
|
167
|
-
if msg["handler"]!=nil && myjob.handler != msg["handler"]
|
167
|
+
if msg["handler"]!=nil && myjob.handler != msg["handler"] && myjob.type!=INTERACTIVE_ACTOR
|
168
168
|
log.debug "Finish received from a different handler "+myjob.handler+" vs "+msg["handler"]+", skipping message"
|
169
169
|
else
|
170
170
|
myjob.finish
|
data/lib/manband/bandmanager.rb
CHANGED
data/lib/manband/flowconfig.rb
CHANGED
@@ -35,11 +35,14 @@ OP_CLEAN = "clean" # Delete work dirs of workflow
|
|
35
35
|
OP_DESTROY = "destroy" # Delete workflow and its work dirs
|
36
36
|
OP_STORE = "store" # Store result to S3
|
37
37
|
|
38
|
+
# Actors type are exclusive
|
38
39
|
# Basic actor
|
39
40
|
ACTOR = -1
|
40
41
|
# If actor, i.e. ony one of the following jobs will be executed. Selected job match the exit code of the command. Type of the node will be set to selected output
|
41
42
|
# WARNING: input of IF actors MUST NOT be a pattern matchng multiple files. The IF condition must be executed only once, not on a bunch of files.
|
42
43
|
IF_ACTOR = -2
|
44
|
+
# Interactive actor: there is no automatic FINISH message. Command is executed and user/an other script will send a FINISH message when appropriate.
|
45
|
+
INTERACTIVE_ACTOR = -3
|
43
46
|
|
44
47
|
|
45
48
|
# This class holds the base config
|
data/lib/manband/job.rb
CHANGED
@@ -34,7 +34,7 @@ class Job
|
|
34
34
|
end
|
35
35
|
|
36
36
|
@@log = Logger.new(STDOUT)
|
37
|
-
@@log.level = Logger::
|
37
|
+
@@log.level = Logger::INFO
|
38
38
|
|
39
39
|
@channel = nil
|
40
40
|
@delivery_tag = nil
|
@@ -95,13 +95,17 @@ class Job
|
|
95
95
|
jobmsg = '{ "workflow" : "'+@wid.to_s+'" , "node" : "'+@node+'", "id" : "'+@id.to_s+'", "handler" : "'+curhandler.to_s+'", "instance" : "'+instance.to_s+'" }'
|
96
96
|
sendmessage(OP_ERROR,jobmsg)
|
97
97
|
else
|
98
|
-
if
|
99
|
-
|
100
|
-
|
101
|
-
|
98
|
+
if @type == INTERACTIVE_ACTOR
|
99
|
+
@@log.debug "Interactive job, job will take in charge the answer and storage"
|
100
|
+
else
|
101
|
+
if curjob.store == STORE_DO || curjob.store == STORE_ERROR
|
102
|
+
workflow = WorkFlow.get(curjob.wid)
|
103
|
+
jobmsg = '{ "id" : "'+curjob.id.to_s+'", "bucket" : "'+workflow.bucket+'" }'
|
104
|
+
sendmessage(OP_STORE,jobmsg)
|
105
|
+
end
|
106
|
+
jobmsg = '{ "workflow" : "'+@wid.to_s+'" , "node" : "'+@node+'", "id" : "'+@id.to_s+'", "handler" : "'+curhandler.to_s+'", "instance" : "'+instance.to_s+'" }'
|
107
|
+
sendmessage(OP_FINISH,jobmsg)
|
102
108
|
end
|
103
|
-
jobmsg = '{ "workflow" : "'+@wid.to_s+'" , "node" : "'+@node+'", "id" : "'+@id.to_s+'", "handler" : "'+curhandler.to_s+'", "instance" : "'+instance.to_s+'" }'
|
104
|
-
sendmessage(OP_FINISH,jobmsg)
|
105
109
|
end
|
106
110
|
ack()
|
107
111
|
end # End EventMachine
|
@@ -120,7 +124,7 @@ class Job
|
|
120
124
|
# wordir: job working directory
|
121
125
|
# instance: instance number in the list of commands
|
122
126
|
def runcommand(workdir,instance)
|
123
|
-
initcmd = "AMQP_URL="" &&
|
127
|
+
initcmd = "AMQP_URL='' && MYSQL_URL='' && WID="+@wid.to_s+" && JID="+@id.to_s+" && INSTANCE="+instance.to_s+" && mkdir -p "+workdir+" && cd "+workdir+" && WORKDIR="+workdir+" && "
|
124
128
|
curjob = Job.get(@id)
|
125
129
|
command = JSON.parse(curjob.command)
|
126
130
|
if command.length > 1
|
data/lib/manband/workflow.rb
CHANGED
@@ -19,7 +19,7 @@ class WorkFlow
|
|
19
19
|
include DataMapper::Resource
|
20
20
|
|
21
21
|
@@log = Logger.new(STDOUT)
|
22
|
-
@@log.level = Logger::
|
22
|
+
@@log.level = Logger::INFO
|
23
23
|
|
24
24
|
property :id, Serial # An auto-increment integer key
|
25
25
|
property :uid, Text # user id
|
@@ -113,6 +113,9 @@ class WorkFlow
|
|
113
113
|
if fworkflow["workflow"][job]["type"]=='if'
|
114
114
|
type = IF_ACTOR
|
115
115
|
end
|
116
|
+
if fworkflow["workflow"][job]["type"]=='interactive'
|
117
|
+
type = INTERACTIVE_ACTOR
|
118
|
+
end
|
116
119
|
workdir = FlowConfig.getjobdir(@workdir)
|
117
120
|
if curnode == "root"
|
118
121
|
workdir = self.workdir + "/root";
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: manband
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 63
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 8
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.8.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Olivier Sallou
|
@@ -126,6 +126,7 @@ extra_rdoc_files:
|
|
126
126
|
- LICENSE
|
127
127
|
files:
|
128
128
|
- bin/env.sh
|
129
|
+
- bin/ackband.rb
|
129
130
|
- bin/manband.rb
|
130
131
|
- bin/remoteband.rb
|
131
132
|
- bin/jobhandler.rb
|