percheron 0.2.4 → 0.3.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.
- checksums.yaml +4 -4
- data/lib/percheron/cli.rb +3 -0
- data/lib/percheron/cli/create_command.rb +12 -0
- data/lib/percheron/cli/main_command.rb +3 -0
- data/lib/percheron/cli/recreate_command.rb +12 -0
- data/lib/percheron/cli/restart_command.rb +12 -0
- data/lib/percheron/container/actions.rb +1 -0
- data/lib/percheron/container/actions/recreate.rb +112 -0
- data/lib/percheron/container/main.rb +37 -5
- data/lib/percheron/stack.rb +12 -0
- data/lib/percheron/version.rb +1 -1
- data/percheron.gemspec +1 -0
- metadata +19 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d54bd472d28eb6065b125a2b34afcaaa081339a
|
4
|
+
data.tar.gz: 61427858a0ac55ed4c9dbb01b4bff1c84a6be39f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a776a8b5509c634cacac0669dd16cc7b6ac8a2ecccbba9caf577fe2901e07ce10e9e94b38e8f5457dc37f2a3d0354791c45884c6030b19cd719d4111d07113de
|
7
|
+
data.tar.gz: 922ef6301086e3c34d3e563a3f18a62b6dfdfbf7f67e8f2f0829139446924a37c2499c88b9fc51944ddcc37b60d06f4e6469285570d6c5e0043f50895fe559c6
|
data/lib/percheron/cli.rb
CHANGED
@@ -2,9 +2,12 @@ require 'clamp'
|
|
2
2
|
|
3
3
|
require 'percheron/cli/abstract_command'
|
4
4
|
require 'percheron/cli/list_command'
|
5
|
+
require 'percheron/cli/restart_command'
|
5
6
|
require 'percheron/cli/start_command'
|
6
7
|
require 'percheron/cli/stop_command'
|
7
8
|
require 'percheron/cli/console_command'
|
9
|
+
require 'percheron/cli/create_command'
|
10
|
+
require 'percheron/cli/recreate_command'
|
8
11
|
require 'percheron/cli/main_command'
|
9
12
|
|
10
13
|
module Percheron
|
@@ -5,6 +5,9 @@ module Percheron
|
|
5
5
|
subcommand 'console', 'Start a pry console session', ConsoleCommand
|
6
6
|
subcommand 'start', 'Start a stack', StartCommand
|
7
7
|
subcommand 'stop', 'Stop a stack', StopCommand
|
8
|
+
subcommand 'restart', 'Restart a stack', RestartCommand
|
9
|
+
subcommand 'create', 'Create a stack', CreateCommand
|
10
|
+
subcommand 'recreate', 'Recreate a stack', RecreateCommand
|
8
11
|
end
|
9
12
|
end
|
10
13
|
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module Percheron
|
2
|
+
module Container
|
3
|
+
module Actions
|
4
|
+
class Recreate
|
5
|
+
|
6
|
+
def initialize(container)
|
7
|
+
@container = container
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute!
|
11
|
+
unless temporary_container_exists?
|
12
|
+
create_image!
|
13
|
+
create_container!
|
14
|
+
rename!
|
15
|
+
else
|
16
|
+
$logger.warn "Not recreating '#{container.name}' container as '#{temporary_name}' because '#{temporary_name}' already exists"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
attr_reader :container
|
23
|
+
|
24
|
+
def create_opts
|
25
|
+
{
|
26
|
+
'name' => temporary_name,
|
27
|
+
'Image' => container.image,
|
28
|
+
'Hostname' => container.name,
|
29
|
+
'Env' => container.env,
|
30
|
+
'ExposedPorts' => container.exposed_ports,
|
31
|
+
'VolumesFrom' => container.volumes
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def temporary_name
|
36
|
+
'%s_wip' % container.name
|
37
|
+
end
|
38
|
+
|
39
|
+
# FIXME
|
40
|
+
def temporary_container_exists?
|
41
|
+
temporary_container.info.empty?
|
42
|
+
rescue Docker::Error::NotFoundError
|
43
|
+
false
|
44
|
+
end
|
45
|
+
|
46
|
+
def create_image!
|
47
|
+
unless image_exists?
|
48
|
+
$logger.debug "Creating '#{container.image}' image"
|
49
|
+
Container::Actions::Build.new(container).execute!
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def create_container!
|
54
|
+
$logger.debug "Recreating '#{container.name}' container as '#{temporary_name}'"
|
55
|
+
Docker::Container.create(create_opts)
|
56
|
+
end
|
57
|
+
|
58
|
+
def rename!
|
59
|
+
save_current_running_state!
|
60
|
+
stop_current! if container.running?
|
61
|
+
rename_current_to_old!
|
62
|
+
rename_wip_to_current!
|
63
|
+
start_new! if container_was_running?
|
64
|
+
end
|
65
|
+
|
66
|
+
def rename_current_new_name
|
67
|
+
'%s_%s' % [ container.name, now_timestamp ]
|
68
|
+
end
|
69
|
+
|
70
|
+
def now_timestamp
|
71
|
+
Time.now.strftime('%Y%m%d%H%M%S')
|
72
|
+
end
|
73
|
+
|
74
|
+
def temporary_container
|
75
|
+
Docker::Container.get(temporary_name)
|
76
|
+
end
|
77
|
+
|
78
|
+
def save_current_running_state!
|
79
|
+
@container_was_running = container.running?
|
80
|
+
end
|
81
|
+
|
82
|
+
def stop_current!
|
83
|
+
Container::Actions::Stop.new(container).execute!
|
84
|
+
end
|
85
|
+
|
86
|
+
def rename_current_to_old!
|
87
|
+
$logger.debug "Renaming '#{container.name}' container to '#{rename_current_new_name}'"
|
88
|
+
container.docker_container.rename(rename_current_new_name)
|
89
|
+
end
|
90
|
+
|
91
|
+
def rename_wip_to_current!
|
92
|
+
# FIXME
|
93
|
+
$logger.debug "Renaming '#{temporary_name}' container to '#{container.name}'"
|
94
|
+
Docker::Container.get(temporary_name).rename(container.name)
|
95
|
+
end
|
96
|
+
|
97
|
+
def start_new!
|
98
|
+
container.start!
|
99
|
+
end
|
100
|
+
|
101
|
+
def image_exists?
|
102
|
+
Docker::Image.exist?(container.image)
|
103
|
+
end
|
104
|
+
|
105
|
+
def container_was_running?
|
106
|
+
@container_was_running
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -66,16 +66,48 @@ module Percheron
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def start!
|
69
|
-
|
69
|
+
create!
|
70
|
+
recreate!
|
70
71
|
Container::Actions::Start.new(self).execute!
|
71
72
|
end
|
72
73
|
|
74
|
+
def restart!
|
75
|
+
stop!
|
76
|
+
start!
|
77
|
+
end
|
78
|
+
|
79
|
+
def create!
|
80
|
+
unless exists?
|
81
|
+
$logger.debug "Container '#{name}' does not exist, creating"
|
82
|
+
Container::Actions::Create.new(self).execute!
|
83
|
+
else
|
84
|
+
$logger.warn "Not creating '#{name}' container as it already exists"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def recreate!(bypass_auto_recreate: false)
|
89
|
+
if exists?
|
90
|
+
if recreate?(bypass_auto_recreate: bypass_auto_recreate)
|
91
|
+
$logger.warn "Container '#{name}' exists and will be recreated"
|
92
|
+
Container::Actions::Recreate.new(self).execute!
|
93
|
+
else
|
94
|
+
if recreatable?
|
95
|
+
$logger.warn "Container '#{name}' MD5's do not match, consider recreating"
|
96
|
+
else
|
97
|
+
$logger.debug "Container '#{name}' does not need to be recreated"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
else
|
101
|
+
$logger.warn "Not recreating '#{name}' container as it does not exist"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
73
105
|
def recreatable?
|
74
|
-
|
106
|
+
!dockerfile_md5s_match?
|
75
107
|
end
|
76
108
|
|
77
|
-
def recreate?
|
78
|
-
recreatable? && versions_mismatch? && auto_recreate?
|
109
|
+
def recreate?(bypass_auto_recreate: false)
|
110
|
+
recreatable? && versions_mismatch? && (bypass_auto_recreate || auto_recreate?)
|
79
111
|
end
|
80
112
|
|
81
113
|
def running?
|
@@ -94,7 +126,7 @@ module Percheron
|
|
94
126
|
|
95
127
|
attr_reader :config, :stack, :container_name
|
96
128
|
|
97
|
-
def
|
129
|
+
def dockerfile_md5s_match?
|
98
130
|
stored_dockerfile_md5 == current_dockerfile_md5
|
99
131
|
end
|
100
132
|
|
data/lib/percheron/stack.rb
CHANGED
@@ -45,6 +45,18 @@ module Percheron
|
|
45
45
|
exec_on_containers { |container| container.start! }
|
46
46
|
end
|
47
47
|
|
48
|
+
def restart!
|
49
|
+
exec_on_containers { |container| container.restart! }
|
50
|
+
end
|
51
|
+
|
52
|
+
def create!
|
53
|
+
exec_on_containers { |container| container.create! }
|
54
|
+
end
|
55
|
+
|
56
|
+
def recreate!(bypass_auto_recreate: false)
|
57
|
+
exec_on_containers { |container| container.recreate!(bypass_auto_recreate: bypass_auto_recreate) }
|
58
|
+
end
|
59
|
+
|
48
60
|
def valid?
|
49
61
|
Validators::Stack.new(self).valid?
|
50
62
|
end
|
data/lib/percheron/version.rb
CHANGED
data/percheron.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: percheron
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ash McKenzie
|
@@ -150,6 +150,20 @@ dependencies:
|
|
150
150
|
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0.9'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: timecop
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0.7'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0.7'
|
153
167
|
description:
|
154
168
|
email:
|
155
169
|
- ash@the-rebellion.net
|
@@ -171,8 +185,11 @@ files:
|
|
171
185
|
- lib/percheron/cli.rb
|
172
186
|
- lib/percheron/cli/abstract_command.rb
|
173
187
|
- lib/percheron/cli/console_command.rb
|
188
|
+
- lib/percheron/cli/create_command.rb
|
174
189
|
- lib/percheron/cli/list_command.rb
|
175
190
|
- lib/percheron/cli/main_command.rb
|
191
|
+
- lib/percheron/cli/recreate_command.rb
|
192
|
+
- lib/percheron/cli/restart_command.rb
|
176
193
|
- lib/percheron/cli/start_command.rb
|
177
194
|
- lib/percheron/cli/stop_command.rb
|
178
195
|
- lib/percheron/config.rb
|
@@ -181,6 +198,7 @@ files:
|
|
181
198
|
- lib/percheron/container/actions.rb
|
182
199
|
- lib/percheron/container/actions/build.rb
|
183
200
|
- lib/percheron/container/actions/create.rb
|
201
|
+
- lib/percheron/container/actions/recreate.rb
|
184
202
|
- lib/percheron/container/actions/start.rb
|
185
203
|
- lib/percheron/container/actions/stop.rb
|
186
204
|
- lib/percheron/container/main.rb
|