abid 0.3.0.pre.alpha.2 → 0.3.0.pre.alpha.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/exe/abid +1 -1
- data/lib/abid.rb +21 -6
- data/lib/abid/application.rb +17 -40
- data/lib/abid/cli.rb +8 -7
- data/lib/abid/cli/assume.rb +4 -3
- data/lib/abid/cli/list.rb +5 -4
- data/lib/abid/cli/migrate.rb +4 -5
- data/lib/abid/cli/revoke.rb +5 -4
- data/lib/abid/config.rb +3 -3
- data/lib/abid/dsl_definition.rb +3 -3
- data/lib/abid/engine.rb +13 -0
- data/lib/abid/engine/executor.rb +126 -0
- data/lib/abid/engine/process.rb +137 -0
- data/lib/abid/engine/process_manager.rb +56 -0
- data/lib/abid/engine/scheduler.rb +96 -0
- data/lib/abid/engine/waiter.rb +83 -0
- data/lib/abid/engine/worker_manager.rb +123 -0
- data/lib/abid/environment.rb +48 -0
- data/lib/abid/job.rb +49 -7
- data/lib/abid/job_manager.rb +22 -0
- data/lib/abid/mixin_task.rb +2 -2
- data/lib/abid/rake_extensions.rb +12 -4
- data/lib/abid/rake_extensions/task.rb +4 -117
- data/lib/abid/state_manager/database.rb +21 -17
- data/lib/abid/state_manager/state.rb +65 -15
- data/lib/abid/state_manager/state_proxy.rb +65 -0
- data/lib/abid/task.rb +1 -15
- data/lib/abid/version.rb +1 -1
- metadata +12 -8
- data/lib/abid/abid_module.rb +0 -19
- data/lib/abid/session.rb +0 -92
- data/lib/abid/state.rb +0 -193
- data/lib/abid/state_manager.rb +0 -17
- data/lib/abid/waiter.rb +0 -110
- data/lib/abid/worker.rb +0 -56
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53398cf57eddf9c3cc6de80acce35fa592c4d00a
|
4
|
+
data.tar.gz: a89e82cc2adb5d59cc1bbf2697ae21f850f5fa29
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06e97ecf6eeb098f101386351b081224b0a665278088e4b266f059603b69ffe8778485a8d9519c18367ee5c964f9c8c8a9c6a56b167da352d2131f38d2ecc883
|
7
|
+
data.tar.gz: 0d20bb8a5032cbec0b2f89416cf8dd872dcce97585685b59447cfb716915423cdd9f25355518e18dc5fc0e2c0e68f0358dad945aa551d79769846366ac5ef9d9
|
data/exe/abid
CHANGED
data/lib/abid.rb
CHANGED
@@ -12,21 +12,25 @@ require 'sqlite3'
|
|
12
12
|
require 'sequel'
|
13
13
|
|
14
14
|
require 'abid/config'
|
15
|
+
require 'abid/environment'
|
15
16
|
require 'abid/error'
|
17
|
+
require 'abid/engine'
|
18
|
+
require 'abid/engine/process'
|
19
|
+
require 'abid/engine/process_manager'
|
20
|
+
require 'abid/engine/executor'
|
21
|
+
require 'abid/engine/scheduler'
|
22
|
+
require 'abid/engine/worker_manager'
|
23
|
+
require 'abid/engine/waiter'
|
16
24
|
require 'abid/params_format'
|
17
|
-
require 'abid/state_manager'
|
25
|
+
require 'abid/state_manager/database'
|
18
26
|
require 'abid/job'
|
27
|
+
require 'abid/job_manager'
|
19
28
|
|
20
29
|
require 'abid/rake_extensions'
|
21
30
|
require 'abid/version'
|
22
|
-
require 'abid/abid_module'
|
23
|
-
require 'abid/waiter'
|
24
|
-
require 'abid/worker'
|
25
31
|
require 'abid/params_parser'
|
26
32
|
require 'abid/play_core'
|
27
33
|
require 'abid/play'
|
28
|
-
require 'abid/session'
|
29
|
-
require 'abid/state'
|
30
34
|
require 'abid/task'
|
31
35
|
require 'abid/mixin_task'
|
32
36
|
require 'abid/task_manager'
|
@@ -35,4 +39,15 @@ require 'abid/application'
|
|
35
39
|
|
36
40
|
module Abid
|
37
41
|
FIXNUM_MAX = (2**(0.size * 8 - 2) - 1) # :nodoc:
|
42
|
+
|
43
|
+
class << self
|
44
|
+
def global
|
45
|
+
@global ||= Environment.new
|
46
|
+
end
|
47
|
+
attr_writer :global
|
48
|
+
|
49
|
+
def application
|
50
|
+
global.application
|
51
|
+
end
|
52
|
+
end
|
38
53
|
end
|
data/lib/abid/application.rb
CHANGED
@@ -2,55 +2,36 @@ module Abid
|
|
2
2
|
class Application < Rake::Application
|
3
3
|
include Abid::TaskManager
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
@rakefiles = %w(abidfile Abidfile abidfile.rb Abidfile.rb) << abidfile
|
10
|
-
@worker = Worker.new(self)
|
11
|
-
|
12
|
-
Abid.config.load
|
13
|
-
end
|
14
|
-
|
15
|
-
def run
|
16
|
-
Abid.application = self
|
17
|
-
super
|
18
|
-
end
|
19
|
-
|
20
|
-
# allows the built-in tasks to load without a abidfile
|
21
|
-
def abidfile
|
22
|
-
File.expand_path(File.join(File.dirname(__FILE__), '..', 'Abidfile.rb'))
|
5
|
+
def initialize(env)
|
6
|
+
super()
|
7
|
+
@rakefiles = %w(abidfile Abidfile abidfile.rb Abidfile.rb)
|
8
|
+
@env = env
|
23
9
|
end
|
24
10
|
|
25
|
-
|
26
|
-
def load_rakefile
|
27
|
-
standard_exception_handling do
|
28
|
-
glob(File.expand_path('../tasks/*.rake', __FILE__)) do |name|
|
29
|
-
Rake.load_rakefile name
|
30
|
-
end
|
31
|
-
end
|
11
|
+
def init
|
32
12
|
super
|
13
|
+
@env.config.load(options.config_file)
|
33
14
|
end
|
34
15
|
|
35
16
|
def run_with_threads
|
36
17
|
yield
|
37
18
|
rescue Exception => err
|
38
|
-
|
19
|
+
Engine.kill(err)
|
39
20
|
raise err
|
40
21
|
else
|
41
|
-
|
22
|
+
Engine.shutdown
|
42
23
|
end
|
43
24
|
|
44
25
|
def invoke_task(task_string) # :nodoc:
|
45
26
|
name, args = parse_task_string(task_string)
|
46
|
-
self[name].
|
27
|
+
Job.find_by_task(self[name]).invoke(*args)
|
47
28
|
end
|
48
29
|
|
49
30
|
def standard_rake_options
|
50
31
|
super.each do |opt|
|
51
32
|
case opt.first
|
52
33
|
when '--execute-print'
|
53
|
-
# disable short option
|
34
|
+
# disable short option (-p)
|
54
35
|
opt.delete_at(1)
|
55
36
|
when '--version'
|
56
37
|
opt[-1] = lambda do |_value|
|
@@ -61,25 +42,21 @@ module Abid
|
|
61
42
|
end
|
62
43
|
end
|
63
44
|
|
64
|
-
def abid_options
|
45
|
+
def abid_options
|
65
46
|
sort_options(
|
66
47
|
[
|
48
|
+
['--config-file', '-C CONFIG_FILE',
|
49
|
+
'Config file path',
|
50
|
+
proc { |v| options.config_file = v }],
|
67
51
|
['--repair',
|
68
52
|
'Run the task in repair mode.',
|
69
|
-
proc { options.repair = true }
|
70
|
-
],
|
53
|
+
proc { options.repair = true }],
|
71
54
|
['--preview', '-p',
|
72
55
|
'Run tasks in preview mode.',
|
73
|
-
proc
|
74
|
-
options.preview = true
|
75
|
-
end
|
76
|
-
],
|
56
|
+
proc { options.preview = true }],
|
77
57
|
['--wait-external-task',
|
78
58
|
'Wait a task finished if it is running in externl process',
|
79
|
-
proc
|
80
|
-
options.wait_external_task_interval = true
|
81
|
-
end
|
82
|
-
]
|
59
|
+
proc { options.wait_external_task = true }]
|
83
60
|
]
|
84
61
|
)
|
85
62
|
end
|
data/lib/abid/cli.rb
CHANGED
@@ -6,18 +6,19 @@ module Abid
|
|
6
6
|
|
7
7
|
def initialize(*args)
|
8
8
|
super(*args)
|
9
|
-
Abid.
|
9
|
+
@env = Abid.global
|
10
|
+
@env.config.load(options[:config_file])
|
10
11
|
end
|
11
12
|
|
12
13
|
desc 'config', 'Show current config'
|
13
14
|
def config
|
14
|
-
puts
|
15
|
+
puts @env.config.to_yaml
|
15
16
|
end
|
16
17
|
|
17
18
|
desc 'migrate', 'Run database migration'
|
18
19
|
def migrate
|
19
20
|
require 'abid/cli/migrate'
|
20
|
-
Migrate.new(options).run
|
21
|
+
Migrate.new(@env, options).run
|
21
22
|
end
|
22
23
|
|
23
24
|
desc 'assume TASK [TASKS..] [PARAMS]', 'Assume the job to be SUCCESSED'
|
@@ -25,9 +26,9 @@ module Abid
|
|
25
26
|
desc: 'set the state even if the job is running'
|
26
27
|
def assume(task, *rest_args)
|
27
28
|
require 'abid/cli/assume'
|
28
|
-
Assume.new(options, [task, *rest_args]).run
|
29
|
+
Assume.new(@env, options, [task, *rest_args]).run
|
29
30
|
rescue AlreadyRunningError
|
30
|
-
|
31
|
+
$stderr.puts '[WARN] task alread running.'
|
31
32
|
end
|
32
33
|
|
33
34
|
desc 'list [PREFIX]', 'List jobs'
|
@@ -35,7 +36,7 @@ module Abid
|
|
35
36
|
option :before, type: :string, aliases: '-b', desc: 'start time filter'
|
36
37
|
def list(prefix = nil)
|
37
38
|
require 'abid/cli/list'
|
38
|
-
List.new(options, prefix).run
|
39
|
+
List.new(@env, options, prefix).run
|
39
40
|
end
|
40
41
|
map ls: :list
|
41
42
|
|
@@ -46,7 +47,7 @@ module Abid
|
|
46
47
|
desc: 'no prompt before removal'
|
47
48
|
def revoke(job_id, *rest_args)
|
48
49
|
require 'abid/cli/revoke'
|
49
|
-
Revoke.new(options, [job_id, *rest_args]).run
|
50
|
+
Revoke.new(@env, options, [job_id, *rest_args]).run
|
50
51
|
end
|
51
52
|
map rm: :revoke
|
52
53
|
end
|
data/lib/abid/cli/assume.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Abid
|
2
2
|
class CLI
|
3
3
|
class Assume
|
4
|
-
def initialize(options, args)
|
4
|
+
def initialize(env, options, args)
|
5
|
+
@env = env
|
5
6
|
@options = options
|
6
7
|
@args = args
|
7
8
|
|
@@ -17,8 +18,8 @@ module Abid
|
|
17
18
|
def assume(task, params)
|
18
19
|
params_str = ParamsFormat.format(params)
|
19
20
|
|
20
|
-
job =
|
21
|
-
state =
|
21
|
+
job = @env.job_manager[task, params]
|
22
|
+
state = job.state.assume(force: @force)
|
22
23
|
|
23
24
|
puts "#{task} #{params_str} (id: #{state.id})" \
|
24
25
|
' is assumed to be SUCCESSED.'
|
data/lib/abid/cli/list.rb
CHANGED
@@ -3,7 +3,8 @@ require 'abid/cli/table_formatter'
|
|
3
3
|
module Abid
|
4
4
|
class CLI
|
5
5
|
class List
|
6
|
-
def initialize(options, prefix)
|
6
|
+
def initialize(env, options, prefix)
|
7
|
+
@env = env
|
7
8
|
@options = options
|
8
9
|
@prefix = prefix
|
9
10
|
|
@@ -16,9 +17,9 @@ module Abid
|
|
16
17
|
end
|
17
18
|
|
18
19
|
def build_table
|
19
|
-
states =
|
20
|
-
|
21
|
-
|
20
|
+
states = @env.db.states
|
21
|
+
.filter_by_prefix(@prefix)
|
22
|
+
.filter_by_start_time(after: @after, before: @before)
|
22
23
|
table = states.map { |state| format_state(state) }
|
23
24
|
TableFormatter.new(table).format
|
24
25
|
end
|
data/lib/abid/cli/migrate.rb
CHANGED
@@ -1,15 +1,14 @@
|
|
1
|
-
require 'abid/state_manager'
|
2
|
-
|
3
1
|
module Abid
|
4
2
|
class CLI
|
5
3
|
class Migrate
|
6
|
-
def initialize(options)
|
4
|
+
def initialize(env, options)
|
5
|
+
@env = env
|
7
6
|
@options = options
|
8
7
|
end
|
9
8
|
|
10
9
|
def run
|
11
|
-
db =
|
12
|
-
dir = StateManager::Database
|
10
|
+
db = Sequel.connect(@env.config.database)
|
11
|
+
dir = StateManager::Database::MIGRATIONS_PATH
|
13
12
|
|
14
13
|
if Sequel::Migrator.is_current?(db, dir)
|
15
14
|
puts 'Schema is latest.'
|
data/lib/abid/cli/revoke.rb
CHANGED
@@ -3,7 +3,8 @@ require 'abid/cli/table_formatter'
|
|
3
3
|
module Abid
|
4
4
|
class CLI
|
5
5
|
class Revoke
|
6
|
-
def initialize(options, job_ids)
|
6
|
+
def initialize(env, options, job_ids)
|
7
|
+
@env = env
|
7
8
|
@options = options
|
8
9
|
@job_ids = job_ids.map(&:to_i)
|
9
10
|
|
@@ -13,9 +14,9 @@ module Abid
|
|
13
14
|
|
14
15
|
def run
|
15
16
|
@job_ids.each do |job_id|
|
16
|
-
state =
|
17
|
+
state = @env.db.states[job_id]
|
17
18
|
if state.nil?
|
18
|
-
$stderr.puts "
|
19
|
+
$stderr.puts "#{job_id} is not found"
|
19
20
|
next
|
20
21
|
end
|
21
22
|
|
@@ -26,7 +27,7 @@ module Abid
|
|
26
27
|
end
|
27
28
|
|
28
29
|
def revoke(state)
|
29
|
-
|
30
|
+
@env.db.states.revoke(state.id, force: @force)
|
30
31
|
puts "revoked #{state.id}"
|
31
32
|
rescue AlreadyRunningError
|
32
33
|
params = ParamsFormat.format(YAML.load(state.params))
|
data/lib/abid/config.rb
CHANGED
@@ -21,7 +21,7 @@ module Abid
|
|
21
21
|
|
22
22
|
# @return [Hash] database configuration
|
23
23
|
def database
|
24
|
-
self['database']
|
24
|
+
self['database'].each_with_object({}) { |(k, v), h| h[k.to_sym] = v }
|
25
25
|
end
|
26
26
|
|
27
27
|
# Load config file.
|
@@ -29,9 +29,9 @@ module Abid
|
|
29
29
|
# If `config_file` is specified and does not exist, it raises an error.
|
30
30
|
#
|
31
31
|
# If `config_file` is not specified, it searches config file in
|
32
|
-
# Config.
|
32
|
+
# Config.search_path.
|
33
33
|
#
|
34
|
-
# When #load is called again, original
|
34
|
+
# When #load is called again, original configurations is cleared.
|
35
35
|
#
|
36
36
|
# @param config_file [String] config file
|
37
37
|
# @return [Config] self
|
data/lib/abid/dsl_definition.rb
CHANGED
@@ -5,11 +5,11 @@ module Abid
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def define_worker(name, thread_count)
|
8
|
-
|
8
|
+
Abid.global.worker_manager.define(name, thread_count)
|
9
9
|
end
|
10
10
|
|
11
11
|
def play_base(&block)
|
12
|
-
|
12
|
+
Abid.application.play_base(&block)
|
13
13
|
end
|
14
14
|
|
15
15
|
def helpers(*extensions, &block)
|
@@ -17,7 +17,7 @@ module Abid
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def invoke(task, *args, **params)
|
20
|
-
|
20
|
+
Job.find_by_task(Abid.application[task, **params]).invoke(*args)
|
21
21
|
end
|
22
22
|
|
23
23
|
def mixin(*args, &block)
|
data/lib/abid/engine.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
module Abid
|
2
|
+
# Engine module operates task execution.
|
3
|
+
module Engine
|
4
|
+
def self.kill(error)
|
5
|
+
Abid.global.worker_manager.kill
|
6
|
+
Abid.global.process_manager.kill(error)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.shutdown
|
10
|
+
Abid.global.worker_manager.shutdown
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
module Abid
|
2
|
+
module Engine
|
3
|
+
# @!visibility private
|
4
|
+
|
5
|
+
# Executor operates each task execution.
|
6
|
+
class Executor
|
7
|
+
def initialize(job, args)
|
8
|
+
@job = job
|
9
|
+
@args = args
|
10
|
+
|
11
|
+
@process = job.process
|
12
|
+
@state = job.state.find
|
13
|
+
@prerequisites = job.prerequisites.map(&:process)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Check if the task should be executed.
|
17
|
+
#
|
18
|
+
# @return [Boolean] false if the task should not be executed.
|
19
|
+
def prepare
|
20
|
+
return unless @process.prepare
|
21
|
+
return false if precheck_to_cancel
|
22
|
+
return false if precheck_to_skip
|
23
|
+
true
|
24
|
+
end
|
25
|
+
|
26
|
+
# Start processing the task.
|
27
|
+
#
|
28
|
+
# The task is executed asynchronously.
|
29
|
+
#
|
30
|
+
# @return [Boolean] false if the task is not executed
|
31
|
+
def start
|
32
|
+
return false unless @prerequisites.all?(&:complete?)
|
33
|
+
|
34
|
+
return false if check_to_cancel
|
35
|
+
return false if check_to_skip
|
36
|
+
|
37
|
+
return false unless @process.start
|
38
|
+
execute_or_wait
|
39
|
+
true
|
40
|
+
end
|
41
|
+
|
42
|
+
def capture_exception
|
43
|
+
yield
|
44
|
+
rescue StandardError, ScriptError => error
|
45
|
+
@process.quit(error)
|
46
|
+
rescue Exception => exception
|
47
|
+
# TODO: exit immediately when fatal error occurs.
|
48
|
+
@process.quit(exception)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
# Cancel the task if it should be.
|
54
|
+
# @return [Boolean] true if cancelled
|
55
|
+
def precheck_to_cancel
|
56
|
+
return false if @job.env.options.repair
|
57
|
+
return false unless @state.failed?
|
58
|
+
return false if @job.task.top_level?
|
59
|
+
@process.cancel(Error.new('task has been failed'))
|
60
|
+
end
|
61
|
+
|
62
|
+
# Skip the task if it should be.
|
63
|
+
# @return [Boolean] true if skipped
|
64
|
+
def precheck_to_skip
|
65
|
+
return @process.skip unless @job.task.concerned?
|
66
|
+
|
67
|
+
return false if @job.env.options.repair && !@prerequisites.empty?
|
68
|
+
return false unless @state.successed?
|
69
|
+
@process.skip
|
70
|
+
end
|
71
|
+
|
72
|
+
# Cancel the task if it should be.
|
73
|
+
# @return [Boolean] true if cancelled
|
74
|
+
def check_to_cancel
|
75
|
+
return false if @prerequisites.empty?
|
76
|
+
return false if @prerequisites.all? { |p| !p.failed? && !p.cancelled? }
|
77
|
+
@process.cancel
|
78
|
+
end
|
79
|
+
|
80
|
+
# Skip the task if it should be.
|
81
|
+
# @return [Boolean] true if skipped
|
82
|
+
def check_to_skip
|
83
|
+
return @process.skip unless @job.task.needed?
|
84
|
+
|
85
|
+
return false if @prerequisites.empty?
|
86
|
+
return false unless @job.env.options.repair
|
87
|
+
return false if @prerequisites.any?(&:successed?)
|
88
|
+
@process.skip
|
89
|
+
end
|
90
|
+
|
91
|
+
# Post the task if no external process executing the same task, wait the
|
92
|
+
# task finished otherwise.
|
93
|
+
def execute_or_wait
|
94
|
+
if @job.state.try_start
|
95
|
+
@job.worker.post { capture_exception { execute } }
|
96
|
+
else
|
97
|
+
Waiter.new(@job).wait
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def execute
|
102
|
+
_, error = safe_execute
|
103
|
+
|
104
|
+
call_after_hooks(error)
|
105
|
+
@job.state.finish(error)
|
106
|
+
@process.finish(error)
|
107
|
+
end
|
108
|
+
|
109
|
+
def safe_execute
|
110
|
+
@job.task.call_hooks(:before_execute)
|
111
|
+
@job.task.execute(@args)
|
112
|
+
true
|
113
|
+
rescue => error
|
114
|
+
[false, error]
|
115
|
+
end
|
116
|
+
|
117
|
+
def call_after_hooks(error)
|
118
|
+
@job.task.call_hooks(:after_invoke, error)
|
119
|
+
true
|
120
|
+
rescue
|
121
|
+
# TODO: Error logging
|
122
|
+
false
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|