themigrator 0.1.3 → 0.1.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/lib/themigrator/cli.rb +7 -1
- data/lib/themigrator/logger.rb +4 -0
- data/lib/themigrator/migration.rb +2 -2
- data/lib/themigrator/migrator.rb +24 -28
- data/lib/themigrator/script.rb +36 -6
- data/lib/themigrator/script_pool.rb +6 -2
- data/lib/themigrator/ui.rb +5 -0
- data/lib/themigrator/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c604771ae4c4bbad1daef23d7053daee6690200c
|
4
|
+
data.tar.gz: 5511873c95b27ffcd87ab7d86d616d62b9bde47e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 17ded8f0c8343627df08fe6cbe770734d1bf47ba8866d29042a35d65bfe4b6a4b911e9d009022eb4caf7c1b0bf18aa7eb9639bd7b12bcd45cd413111e93667b1
|
7
|
+
data.tar.gz: a08b65371dd25033a64ac9c9e27830de346bef3c20d23a204a8585ebd02e8ec770a4f92157b3795e692b1bda143501e32b6a3eee4df68aa29cd80a638d76248d
|
data/lib/themigrator/cli.rb
CHANGED
@@ -8,7 +8,13 @@ module Themigrator
|
|
8
8
|
desc "migrate", "Migrate the current project"
|
9
9
|
def migrate
|
10
10
|
migrator = Themigrator::Migrator.new(Dir.pwd)
|
11
|
-
|
11
|
+
pid = fork do
|
12
|
+
exit migrator.migrate! ? 0 : -1
|
13
|
+
end
|
14
|
+
Process.detach(pid)
|
15
|
+
log_file = migrator.main_log_path(Dir.pwd, migrator.run_id)
|
16
|
+
sleep 0.1
|
17
|
+
Process.exec("tail --pid=#{pid} --lines=+0 --follow #{log_file}")
|
12
18
|
end
|
13
19
|
|
14
20
|
desc "roles", "show the list of roles"
|
data/lib/themigrator/logger.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
|
1
|
+
require 'set'
|
2
2
|
|
3
3
|
module Themigrator
|
4
4
|
|
5
5
|
# Holds the plan of the migration
|
6
6
|
class Migration
|
7
7
|
|
8
|
-
ACTIONS = %w(setup pre-migrate migrate cleanup
|
8
|
+
ACTIONS = %w(setup pre-migrate migrate cleanup)
|
9
9
|
SCRIPTS = ACTIONS | %w(rollback)
|
10
10
|
|
11
11
|
attr_reader :roles, :actions
|
data/lib/themigrator/migrator.rb
CHANGED
@@ -7,10 +7,12 @@ module Themigrator
|
|
7
7
|
class Migrator
|
8
8
|
include Logger
|
9
9
|
|
10
|
+
attr_reader :run_id
|
10
11
|
|
11
12
|
def initialize(dir)
|
12
13
|
@dir = dir
|
13
14
|
@runned_roles = []
|
15
|
+
@run_id = Time.now.strftime("%Y-%m-%d-%H:%M:%S")
|
14
16
|
end
|
15
17
|
|
16
18
|
def migrate!
|
@@ -19,19 +21,18 @@ module Themigrator
|
|
19
21
|
|
20
22
|
init_logger(main_log_path(@dir, run_id))
|
21
23
|
|
22
|
-
log "
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
log "start PID=#{$$}"
|
25
|
+
log "roles: #{@migration.roles.join(" ")}"
|
26
|
+
did_it_work = true
|
27
|
+
each_action do |action|
|
28
|
+
if !run_action_and_wait(action)
|
29
|
+
did_it_work = false
|
30
|
+
run_rollback_and_wait("rollback")
|
31
|
+
return -1
|
27
32
|
end
|
28
|
-
return true
|
29
33
|
end
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
def run_id
|
34
|
-
@run_id ||= Time.now.strftime("%Y-%m-%d-%H:%M:%S")
|
34
|
+
close_logger
|
35
|
+
did_it_work
|
35
36
|
end
|
36
37
|
|
37
38
|
private
|
@@ -50,34 +51,29 @@ module Themigrator
|
|
50
51
|
@runned_roles.uniq!
|
51
52
|
end
|
52
53
|
|
53
|
-
def run_rollback_and_wait
|
54
|
-
script_pool = ScriptPool.new
|
55
|
-
each_role("rollback") do |role|
|
56
|
-
next unless @runned_roles.include?(role)
|
57
|
-
script_path = find_script(role, action)
|
58
|
-
log_path = log_path(@dir,run_id,role, action)
|
59
|
-
|
60
|
-
log("[running #{action} for #{role}]")
|
61
|
-
|
62
|
-
script_pool.add_script(script_path,log_path)
|
63
|
-
end
|
64
|
-
script_pool.run_and_wait
|
65
|
-
end
|
66
54
|
|
67
55
|
def run_action_and_wait(action)
|
56
|
+
log "#{action} => start"
|
68
57
|
script_pool = ScriptPool.new
|
69
58
|
|
70
59
|
each_role(action) do |role|
|
60
|
+
next if role == "rollback" && !@runned_roles.include?(role)
|
61
|
+
|
71
62
|
script_path = find_script(role, action)
|
72
63
|
log_path = log_path(@dir,run_id,role, action)
|
73
64
|
|
74
|
-
log("[running #{action} for #{role}]")
|
75
65
|
|
76
|
-
|
66
|
+
log "#{action} | #{role} => start"
|
67
|
+
script_pool.add_script(script_path,log_path, role: role, action: action) do |s|
|
68
|
+
action = s.attr[:action]
|
69
|
+
role = s.attr[:role]
|
70
|
+
log "#{action} | #{role} => exited with #{s.exitcode} (#{s.run_time * 1000} ms)"
|
71
|
+
end
|
77
72
|
end
|
78
73
|
|
79
|
-
script_pool.run_and_wait
|
80
|
-
|
74
|
+
ok = script_pool.run_and_wait
|
75
|
+
log("#{action} => #{ok ? "done" : "fail"} (#{script_pool.run_time*1000} ms)")
|
76
|
+
ok
|
81
77
|
end
|
82
78
|
|
83
79
|
def find_script(role, action)
|
data/lib/themigrator/script.rb
CHANGED
@@ -2,22 +2,44 @@
|
|
2
2
|
|
3
3
|
module Themigrator
|
4
4
|
class Script
|
5
|
-
|
5
|
+
attr_reader :script, :log_file, :attr
|
6
|
+
|
7
|
+
# new creates a new script but doesn't start until called run
|
8
|
+
# Arguments:
|
9
|
+
# * script : Fullpath of the file to execute
|
10
|
+
# * log_file: Fullpath of the file to save the log
|
11
|
+
# * attr: Extra attributes that could be handy (not used
|
12
|
+
# internally by Script)
|
13
|
+
# * finish_cbk: A block that will receive the following arguments
|
14
|
+
# 1 The script itself
|
15
|
+
def initialize(script, log_file, attr = {}, &finish_cbk)
|
16
|
+
require 'byebug'
|
17
|
+
@attr = attr
|
6
18
|
@script = script
|
7
|
-
@log_file =
|
19
|
+
@log_file = log_file
|
20
|
+
@log_fd = File.open(@log_file, "w", 0600)
|
8
21
|
@wd_dir = File.dirname(script)
|
9
22
|
@pid = nil
|
10
23
|
@thread = nil
|
24
|
+
@start_time = Time.now
|
25
|
+
@end_time = nil
|
26
|
+
@finish_cbk = finish_cbk
|
27
|
+
end
|
28
|
+
|
29
|
+
def run_time
|
30
|
+
@end_time - @start_time if @end_time
|
11
31
|
end
|
12
32
|
|
13
33
|
def run
|
14
34
|
@thread = Thread.new do
|
15
35
|
@pid = Process.spawn(@script,
|
16
|
-
err: @
|
17
|
-
out: @
|
36
|
+
err: @log_fd,
|
37
|
+
out: @log_fd,
|
18
38
|
chdir: @wd_dir)
|
19
39
|
pid, status = Process.wait2(@pid)
|
20
|
-
|
40
|
+
@end_time = Time.now
|
41
|
+
close
|
42
|
+
return_code = if status.signaled?
|
21
43
|
signal = Signal.list.find{|k,v|
|
22
44
|
v == status.termsig
|
23
45
|
}
|
@@ -25,10 +47,18 @@ module Themigrator
|
|
25
47
|
else
|
26
48
|
status.exitstatus
|
27
49
|
end
|
50
|
+
|
51
|
+
Thread.new { invoke_cbks } if @finish_cbk
|
52
|
+
|
53
|
+
return_code
|
28
54
|
end
|
29
55
|
sleep 0
|
30
56
|
end
|
31
57
|
|
58
|
+
def invoke_cbks
|
59
|
+
@finish_cbk.call(self)
|
60
|
+
end
|
61
|
+
|
32
62
|
# Waits for the process to be over
|
33
63
|
def wait(seconds = nil)
|
34
64
|
@thread.join(seconds)
|
@@ -71,7 +101,7 @@ module Themigrator
|
|
71
101
|
end
|
72
102
|
|
73
103
|
def close
|
74
|
-
@
|
104
|
+
@log_fd.close
|
75
105
|
end
|
76
106
|
|
77
107
|
end
|
@@ -3,14 +3,15 @@ require 'themigrator/script'
|
|
3
3
|
|
4
4
|
module Themigrator
|
5
5
|
class ScriptPool
|
6
|
+
attr_reader :scripts, :run_time
|
6
7
|
def initialize
|
7
8
|
@queue = Queue.new
|
8
9
|
@lock = Mutex.new
|
9
10
|
@scripts = []
|
10
11
|
end
|
11
12
|
|
12
|
-
def add_script(script,log_file)
|
13
|
-
s = Script.new(script, log_file)
|
13
|
+
def add_script(script,log_file, attr = {},&block)
|
14
|
+
s = Script.new(script, log_file, attr, &block)
|
14
15
|
@lock.synchronize do
|
15
16
|
@scripts << s
|
16
17
|
end
|
@@ -22,10 +23,13 @@ module Themigrator
|
|
22
23
|
# * true: All scripts returned 0
|
23
24
|
# * false: Some of the scripts fail
|
24
25
|
def run_and_wait
|
26
|
+
start = Time.now
|
25
27
|
@lock.synchronize do
|
26
28
|
start_scripts
|
27
29
|
collect_result
|
28
30
|
end
|
31
|
+
ensure
|
32
|
+
@run_time = start - Time.now
|
29
33
|
end
|
30
34
|
|
31
35
|
private
|
data/lib/themigrator/ui.rb
CHANGED
data/lib/themigrator/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: themigrator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Guillermo Álvarez
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|