abid 0.3.0.pre.alpha.3 → 0.3.0.pre.alpha.4
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/README.md +3 -3
- data/abid.gemspec +1 -2
- data/exe/abidsc +1 -1
- data/lib/abid.rb +3 -30
- data/lib/abid/application.rb +83 -13
- data/lib/abid/cli/assume.rb +7 -8
- data/lib/abid/cli/list.rb +2 -2
- data/lib/abid/cli/migrate.rb +1 -1
- data/lib/abid/cli/revoke.rb +9 -10
- data/lib/abid/config.rb +2 -0
- data/lib/abid/dsl/abid_job.rb +58 -0
- data/lib/abid/dsl/actions.rb +36 -0
- data/lib/abid/dsl/job.rb +58 -0
- data/lib/abid/dsl/job_manager.rb +53 -0
- data/lib/abid/dsl/mixin.rb +52 -0
- data/lib/abid/dsl/params_spec.rb +64 -0
- data/lib/abid/dsl/play.rb +35 -0
- data/lib/abid/dsl/play_core.rb +354 -0
- data/lib/abid/dsl/rake_job.rb +41 -0
- data/lib/abid/dsl/syntax.rb +34 -0
- data/lib/abid/dsl/task.rb +53 -0
- data/lib/abid/engine.rb +36 -6
- data/lib/abid/engine/executor.rb +30 -48
- data/lib/abid/engine/process.rb +102 -68
- data/lib/abid/engine/process_manager.rb +72 -28
- data/lib/abid/engine/scheduler.rb +24 -30
- data/lib/abid/engine/waiter.rb +20 -30
- data/lib/abid/engine/worker_manager.rb +26 -60
- data/lib/abid/environment.rb +12 -27
- data/lib/abid/error.rb +2 -0
- data/lib/abid/params_format.rb +29 -12
- data/lib/abid/rake_extensions.rb +11 -3
- data/lib/abid/state_manager.rb +40 -0
- data/lib/abid/state_manager/state.rb +52 -114
- data/lib/abid/state_manager/state_service.rb +88 -0
- data/lib/abid/status.rb +63 -0
- data/lib/abid/version.rb +1 -1
- metadata +19 -32
- data/lib/Abidfile.rb +0 -1
- data/lib/abid/dsl_definition.rb +0 -29
- data/lib/abid/job.rb +0 -67
- data/lib/abid/job_manager.rb +0 -22
- data/lib/abid/mixin_task.rb +0 -29
- data/lib/abid/params_parser.rb +0 -50
- data/lib/abid/play.rb +0 -66
- data/lib/abid/play_core.rb +0 -53
- data/lib/abid/rake_extensions/task.rb +0 -41
- data/lib/abid/state_manager/database.rb +0 -40
- data/lib/abid/state_manager/state_proxy.rb +0 -65
- data/lib/abid/task.rb +0 -123
- data/lib/abid/task_manager.rb +0 -61
data/lib/abid/play_core.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
module Abid
|
2
|
-
module PlayCore
|
3
|
-
def set(name, value = nil, &block)
|
4
|
-
var = :"@#{name}"
|
5
|
-
|
6
|
-
define_method(name) do
|
7
|
-
unless instance_variable_defined?(var)
|
8
|
-
if !value.nil?
|
9
|
-
instance_variable_set(var, value)
|
10
|
-
elsif block_given?
|
11
|
-
instance_variable_set(var, instance_eval(&block))
|
12
|
-
end
|
13
|
-
end
|
14
|
-
instance_variable_get(var)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def params_spec
|
19
|
-
@params_spec ||= {}
|
20
|
-
end
|
21
|
-
|
22
|
-
def param(name, **param_spec)
|
23
|
-
define_method(name) { task.params[name] }
|
24
|
-
params_spec[name] = { significant: true }.merge(param_spec)
|
25
|
-
end
|
26
|
-
|
27
|
-
def undef_param(name)
|
28
|
-
params_spec.delete(name)
|
29
|
-
undef_method(name) if method_defined?(name)
|
30
|
-
end
|
31
|
-
|
32
|
-
def include(*mod)
|
33
|
-
ms = mod.map do |m|
|
34
|
-
if m.is_a? Module
|
35
|
-
m
|
36
|
-
else
|
37
|
-
mixin_task = task.application[m, task.scope]
|
38
|
-
|
39
|
-
fail "#{m} is not a mixin" unless mixin_task.is_a? MixinTask
|
40
|
-
|
41
|
-
mixin_task.mixin.tap do |mixin|
|
42
|
-
# inherit params_spec
|
43
|
-
mixin.params_spec.each do |k, v|
|
44
|
-
params_spec[k] ||= v
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
super(*ms)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
module Abid
|
2
|
-
module RakeExtensions
|
3
|
-
module Task
|
4
|
-
def volatile?
|
5
|
-
true
|
6
|
-
end
|
7
|
-
|
8
|
-
def worker
|
9
|
-
:default
|
10
|
-
end
|
11
|
-
|
12
|
-
def job
|
13
|
-
Job[name, defined?(params) ? params : {}]
|
14
|
-
end
|
15
|
-
|
16
|
-
def params
|
17
|
-
{}
|
18
|
-
end
|
19
|
-
|
20
|
-
def name_with_params
|
21
|
-
name
|
22
|
-
end
|
23
|
-
|
24
|
-
def concerned?
|
25
|
-
true
|
26
|
-
end
|
27
|
-
|
28
|
-
def top_level?
|
29
|
-
application.top_level_tasks.any? { |t| application[t] == self }
|
30
|
-
end
|
31
|
-
|
32
|
-
def hooks
|
33
|
-
@hooks ||= Hash.new { |h, k| h[k] = [] }
|
34
|
-
end
|
35
|
-
|
36
|
-
def call_hooks(tag, *args)
|
37
|
-
hooks[tag].each { |h| h.call(*args) }
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'sequel/plugins/serialization'
|
2
|
-
require 'abid/state_manager/state'
|
3
|
-
require 'abid/state_manager/state_proxy'
|
4
|
-
|
5
|
-
module Abid
|
6
|
-
module StateManager
|
7
|
-
class Database
|
8
|
-
Sequel.extension :migration
|
9
|
-
|
10
|
-
MIGRATIONS_PATH = File.expand_path('../../../../migrations', __FILE__)
|
11
|
-
|
12
|
-
# Creates a new database object and checks schema version.
|
13
|
-
#
|
14
|
-
# @return [Sequel::Database] database object
|
15
|
-
# @see Sequel.connect
|
16
|
-
def self.connect(*args)
|
17
|
-
db = Sequel.connect(*args)
|
18
|
-
Sequel::Migrator.check_current(db, MIGRATIONS_PATH)
|
19
|
-
db
|
20
|
-
rescue Sequel::Migrator::NotCurrentError
|
21
|
-
raise Error, 'current schema is out of date'
|
22
|
-
end
|
23
|
-
|
24
|
-
def initialize(env)
|
25
|
-
@env = env
|
26
|
-
@mon = Monitor.new
|
27
|
-
end
|
28
|
-
|
29
|
-
def connection
|
30
|
-
@connection ||= self.class.connect(@env.config.database)
|
31
|
-
end
|
32
|
-
|
33
|
-
def states
|
34
|
-
@mon.synchronize do
|
35
|
-
@states ||= Class.new(State.Model(connection[:states]))
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
require 'forwardable'
|
2
|
-
|
3
|
-
module Abid
|
4
|
-
module StateManager
|
5
|
-
# StateProxy provides accessor methods to State for Job#state.
|
6
|
-
#
|
7
|
-
# StateProxy holds a reference to the job, and find corresponding state
|
8
|
-
# every time when needed.
|
9
|
-
#
|
10
|
-
# Use StateProxy#find if you have to access the undergrounding State object
|
11
|
-
# many times.
|
12
|
-
class StateProxy
|
13
|
-
def initialize(job)
|
14
|
-
@job = job
|
15
|
-
@states = job.env.db.states
|
16
|
-
end
|
17
|
-
|
18
|
-
# Find underlying State object
|
19
|
-
#
|
20
|
-
# @return [State] state corresponding the job.
|
21
|
-
def find
|
22
|
-
if @job.volatile?
|
23
|
-
@states.init_by_job(@job).tap(&:freeze)
|
24
|
-
else
|
25
|
-
@states.find_or_init_by_job(@job).tap(&:freeze)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
alias instance find
|
29
|
-
|
30
|
-
# Update the state to started unless volatile.
|
31
|
-
# @see State.start
|
32
|
-
def start
|
33
|
-
return if @job.dryrun? || @job.volatile?
|
34
|
-
@states.start(@job)
|
35
|
-
end
|
36
|
-
|
37
|
-
# Try to update the state to started unless volatile.
|
38
|
-
# @see State.start
|
39
|
-
# @return [Boolean] false if already running
|
40
|
-
def try_start
|
41
|
-
start
|
42
|
-
true
|
43
|
-
rescue AlreadyRunningError
|
44
|
-
false
|
45
|
-
end
|
46
|
-
|
47
|
-
# Update the state to SUCCESSED / FAILED unless volatile.
|
48
|
-
# @see State.finish
|
49
|
-
def finish(error = nil)
|
50
|
-
return if @job.dryrun? || @job.volatile?
|
51
|
-
@states.finish(@job, error)
|
52
|
-
end
|
53
|
-
|
54
|
-
def assume(force: false)
|
55
|
-
@states.assume(@job, force: force)
|
56
|
-
end
|
57
|
-
|
58
|
-
# for testing
|
59
|
-
def mock_fail(error)
|
60
|
-
start
|
61
|
-
finish(error)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
data/lib/abid/task.rb
DELETED
@@ -1,123 +0,0 @@
|
|
1
|
-
module Abid
|
2
|
-
class Task < Rake::Task
|
3
|
-
extend Forwardable
|
4
|
-
|
5
|
-
attr_accessor :play_class_definition, :extends
|
6
|
-
attr_reader :play, :params
|
7
|
-
|
8
|
-
def_delegators :play, :worker, :volatile?
|
9
|
-
|
10
|
-
def initialize(task_name, app)
|
11
|
-
super(task_name, app)
|
12
|
-
@siblings = {}
|
13
|
-
end
|
14
|
-
|
15
|
-
def play_class
|
16
|
-
return @play_class if @play_class
|
17
|
-
|
18
|
-
task = self
|
19
|
-
klass = application.lookup_play_class(extends, scope)
|
20
|
-
@play_class = Class.new(klass) do |c|
|
21
|
-
c.task = task
|
22
|
-
c.class_eval(&task.play_class_definition)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def bound?
|
27
|
-
!@play.nil?
|
28
|
-
end
|
29
|
-
|
30
|
-
def bind(**params)
|
31
|
-
fail 'already bound' if bound?
|
32
|
-
|
33
|
-
parsed_params = ParamsParser.parse(params, play_class.params_spec)
|
34
|
-
return @siblings[parsed_params] if @siblings.include?(parsed_params)
|
35
|
-
|
36
|
-
sorted_params = parsed_params.sort.to_h
|
37
|
-
sorted_params.freeze
|
38
|
-
|
39
|
-
@siblings[sorted_params] = dup.tap do |t|
|
40
|
-
t.instance_eval do
|
41
|
-
@prerequisites = []
|
42
|
-
@params = sorted_params
|
43
|
-
@play = play_class.new(t)
|
44
|
-
call_play_hooks(:setup)
|
45
|
-
bind_play_hooks(:before, :before_execute)
|
46
|
-
bind_play_hooks(:after, :after_invoke)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def prerequisite_tasks
|
52
|
-
fail 'no play is bound yet' unless bound?
|
53
|
-
|
54
|
-
prerequisites.map do |pre, params|
|
55
|
-
application[pre, @scope, **self.params.merge(params)]
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
# Name of task with argument list description.
|
60
|
-
def name_with_args # :nodoc:
|
61
|
-
if params_description
|
62
|
-
"#{super} #{params_description}"
|
63
|
-
else
|
64
|
-
super
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
# Name of task with params
|
69
|
-
def name_with_params # :nodoc:
|
70
|
-
if params_description
|
71
|
-
"#{name} #{params_description}"
|
72
|
-
else
|
73
|
-
super
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def params_description
|
78
|
-
sig_params = play_class.params_spec.select do |_, spec|
|
79
|
-
spec[:significant]
|
80
|
-
end
|
81
|
-
return if sig_params.empty?
|
82
|
-
|
83
|
-
if bound? # unbound
|
84
|
-
p = sig_params.map { |name, _| "#{name}=#{params[name]}" }
|
85
|
-
else
|
86
|
-
p = sig_params.map { |name, spec| "#{name}:#{spec[:type]}" }
|
87
|
-
end
|
88
|
-
|
89
|
-
p.join(' ')
|
90
|
-
end
|
91
|
-
|
92
|
-
# Execute the play associated with this task.
|
93
|
-
def execute(_args = nil)
|
94
|
-
fail 'no play is bound yet' unless bound?
|
95
|
-
|
96
|
-
if application.options.dryrun
|
97
|
-
application.trace "** Execute (dry run) #{name_with_params}"
|
98
|
-
return
|
99
|
-
end
|
100
|
-
if application.options.trace
|
101
|
-
application.trace "** Execute #{name_with_params}"
|
102
|
-
end
|
103
|
-
|
104
|
-
play.run
|
105
|
-
end
|
106
|
-
|
107
|
-
def bind_play_hooks(tag, to = nil)
|
108
|
-
to ||= tag
|
109
|
-
hooks[to] = [proc { |*args| call_play_hooks(tag, *args) }]
|
110
|
-
end
|
111
|
-
|
112
|
-
def call_play_hooks(tag, *args)
|
113
|
-
return unless bound?
|
114
|
-
play_class.hooks[tag].each { |blk| play.instance_exec(*args, &blk) }
|
115
|
-
end
|
116
|
-
|
117
|
-
class <<self
|
118
|
-
def define_play(*args, &block) # :nodoc:
|
119
|
-
Abid.application.define_play(self, *args, &block)
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
data/lib/abid/task_manager.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
module Abid
|
2
|
-
module TaskManager
|
3
|
-
def initialize
|
4
|
-
super
|
5
|
-
end
|
6
|
-
|
7
|
-
def define_play(task_class, play_name, extends: nil, &block)
|
8
|
-
define_task(task_class, play_name).tap do |task|
|
9
|
-
task.extends = extends
|
10
|
-
task.play_class_definition = block
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def define_mixin(task_class, mixin_name, &block)
|
15
|
-
define_task(task_class, mixin_name).tap do |task|
|
16
|
-
task.mixin_definition = block
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def [](task_name, scopes = nil, **params)
|
21
|
-
task = super(task_name, scopes)
|
22
|
-
|
23
|
-
if task.respond_to? :bind
|
24
|
-
task.bind(**params)
|
25
|
-
else
|
26
|
-
task
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def play_base(&block)
|
31
|
-
if block_given?
|
32
|
-
@play_base = Class.new(Abid::Play, &block)
|
33
|
-
else
|
34
|
-
@play_base ||= Abid::Play
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def lookup_play_class(task_name, scope = nil)
|
39
|
-
if task_name.nil?
|
40
|
-
play_base
|
41
|
-
elsif task_name.is_a? Class
|
42
|
-
task_name
|
43
|
-
else
|
44
|
-
t = lookup(task_name.to_s, scope)
|
45
|
-
if t.respond_to? :play_class
|
46
|
-
t.play_class
|
47
|
-
elsif t.nil?
|
48
|
-
fail "play #{task_name} not found"
|
49
|
-
else
|
50
|
-
fail "task #{task_name} has no play class"
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
class << self
|
56
|
-
def record_task_metadata # :nodoc:
|
57
|
-
Rake::TaskManager.record_task_metadata
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|