mamiya 0.1.2 → 0.2.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/mamiya/cli.rb +16 -1
- data/lib/mamiya/cli/client.rb +92 -106
- data/lib/mamiya/master/agent_monitor_handlers.rb +5 -1
- data/lib/mamiya/storages/abstract.rb +1 -1
- data/lib/mamiya/version.rb +1 -1
- data/spec/master/agent_monitor_spec.rb +35 -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: 8f6320e41f8d3a3c92628c2f4a97b9c6cb650638
|
4
|
+
data.tar.gz: 63e601a5888ffb6c6bb8a09cb3e74ce9fd620097
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2e934e133d36bb1386e99e86c786bb8ba41831b6e9c44a708c1e4aa38da34738364b01cb221a3965e07e2cf6efce0415fb919676eabfe5ab2730ab940c3a97b4
|
7
|
+
data.tar.gz: f781c7ef2f4c22d5f62462aac173f43381509835784b2e0da8ba0104f309daa02a9d1c503052b6774eda743b737012ed3828f27609c34428485eb0a01557c2de
|
data/lib/mamiya/cli.rb
CHANGED
@@ -124,6 +124,16 @@ module Mamiya
|
|
124
124
|
).run!
|
125
125
|
end
|
126
126
|
|
127
|
+
desc "prune NUMS_TO_KEEP", "Delete old packages, but keep last $NUMS_TO_KEEP packages"
|
128
|
+
def prune(nums_to_keep)
|
129
|
+
puts "Pruning packages from #{application} (keeping last #{nums_to_keep.to_i} packages)..."
|
130
|
+
|
131
|
+
removed = storage.prune(nums_to_keep.to_i)
|
132
|
+
|
133
|
+
puts "Pruned #{removed.size} packages:"
|
134
|
+
puts removed.join(?\n)
|
135
|
+
end
|
136
|
+
|
127
137
|
desc "fetch PACKAGE DESTINATION", "Retrieve package from storage"
|
128
138
|
def fetch(package_atom, destination)
|
129
139
|
Mamiya::Steps::Fetch.new(
|
@@ -293,7 +303,12 @@ module Mamiya
|
|
293
303
|
end
|
294
304
|
|
295
305
|
def application
|
296
|
-
|
306
|
+
@_application ||=
|
307
|
+
options[:application] \
|
308
|
+
|| ENV['MAMIYA_APP'] \
|
309
|
+
|| ENV['MAMIYA_APPLICATION'] \
|
310
|
+
|| config[:application] \
|
311
|
+
|| script.application
|
297
312
|
end
|
298
313
|
|
299
314
|
def storage
|
data/lib/mamiya/cli/client.rb
CHANGED
@@ -178,86 +178,16 @@ not distributed: #{dist['not_distributed_count']} agents
|
|
178
178
|
method_option :no_switch, type: :boolean, default: false
|
179
179
|
method_option :synced_release, type: :boolean, default: false
|
180
180
|
def deploy(package)
|
181
|
-
|
182
|
-
synced_release = options[:synced_release] || (config && config.synced_release)
|
183
|
-
|
184
|
-
# TODO: move this run on master node side
|
185
|
-
puts "=> Deploying #{application}/#{package}"
|
186
|
-
puts " * onto agents which labeled: #{options[:labels].inspect}" if options[:labels] && !options[:labels].empty?
|
187
|
-
puts " * releasing will be synced in all agents" if synced_release
|
188
|
-
|
189
|
-
show_package(package)
|
190
|
-
|
191
|
-
if config
|
192
|
-
config.set :application, application
|
193
|
-
config.set :package_name, package
|
194
|
-
config.set :package, @meta
|
195
|
-
|
196
|
-
config.before_deploy_or_rollback[]
|
197
|
-
config.before_deploy[]
|
198
|
-
end
|
199
|
-
|
200
|
-
do_prep = -> do
|
201
|
-
puts "=> Preparing..."
|
202
|
-
prepare(package)
|
203
|
-
end
|
204
|
-
|
205
|
-
do_prep[]
|
206
|
-
|
207
|
-
puts " * Wait until prepared"
|
208
|
-
puts ""
|
209
|
-
|
210
|
-
i = 0
|
211
|
-
loop do
|
212
|
-
i += 1
|
213
|
-
do_prep[] if i % 25 == 0
|
214
|
-
|
215
|
-
s = pkg_status(package, :short)
|
216
|
-
puts ""
|
217
|
-
break if 0 < s['participants_count'] && s['non_participants'].empty? && s['participants_count'] == s['prepare']['done'].size
|
218
|
-
sleep 2
|
219
|
-
end
|
220
|
-
|
221
|
-
###
|
222
|
-
#
|
223
|
-
|
224
|
-
unless options[:no_switch]
|
225
|
-
puts "=> Switching..."
|
226
|
-
switch_(package, no_release: synced_release)
|
227
|
-
|
228
|
-
puts " * Wait until switch"
|
229
|
-
puts ""
|
230
|
-
loop do
|
231
|
-
s = pkg_status(package, :short)
|
232
|
-
puts ""
|
233
|
-
break if s['participants_count'] == s['switch']['done'].size
|
234
|
-
sleep 2
|
235
|
-
end
|
236
|
-
|
237
|
-
if synced_release
|
238
|
-
puts "=> Releasing..."
|
239
|
-
switch_(package, do_release: true)
|
240
|
-
|
241
|
-
puts " * due to current implementation's limitation, releasing will be untracked."
|
242
|
-
end
|
243
|
-
end
|
244
|
-
rescue Exception => e
|
245
|
-
@deploy_exception = e
|
246
|
-
$stderr.puts "ERROR: #{e.inspect}"
|
247
|
-
$stderr.puts "\t#{e.backtrace.join("\n\t")}"
|
248
|
-
ensure
|
249
|
-
config.after_deploy[@deploy_exception] if config
|
250
|
-
config.after_deploy_or_rollback[@deploy_exception] if config
|
251
|
-
puts "=> Done."
|
181
|
+
deploy_or_rollback(:deploy, package)
|
252
182
|
end
|
253
183
|
|
254
|
-
desc "rollback", "Switch back to previous release
|
184
|
+
desc "rollback", "Switch back to previous release"
|
255
185
|
method_option :labels, type: :string
|
256
186
|
method_option :no_release, type: :boolean, default: false
|
257
187
|
method_option :config, aliases: '-C', type: :string
|
188
|
+
method_option :no_switch, type: :boolean, default: false
|
189
|
+
method_option :synced_release, type: :boolean, default: false
|
258
190
|
def rollback
|
259
|
-
@deploy_exception = nil
|
260
|
-
# TODO: move this run on master node side
|
261
191
|
appstatus = master_get("/applications/#{application}/status", options[:labels] ? {labels: options[:labels]} : {})
|
262
192
|
package = appstatus['common_previous_release']
|
263
193
|
|
@@ -265,37 +195,7 @@ not distributed: #{dist['not_distributed_count']} agents
|
|
265
195
|
raise 'there is no common_previous_release for specified application'
|
266
196
|
end
|
267
197
|
|
268
|
-
|
269
|
-
puts " * with labels: #{options[:labels].inspect}" if options[:labels] && !options[:labels].empty?
|
270
|
-
|
271
|
-
show_package(package)
|
272
|
-
|
273
|
-
if config
|
274
|
-
config.set :application, application
|
275
|
-
config.set :package_name, package
|
276
|
-
config.set :package, @meta
|
277
|
-
|
278
|
-
config.before_deploy_or_rollback[]
|
279
|
-
config.before_rollback[]
|
280
|
-
end
|
281
|
-
|
282
|
-
switch(package)
|
283
|
-
|
284
|
-
puts " * Wait until switch"
|
285
|
-
puts ""
|
286
|
-
loop do
|
287
|
-
s = pkg_status(package, :short)
|
288
|
-
puts ""
|
289
|
-
break if 0 < s['participants_count'] && s['participants_count'] == s['switch']['done'].size
|
290
|
-
sleep 2
|
291
|
-
end
|
292
|
-
rescue Exception => e
|
293
|
-
@deploy_exception = e
|
294
|
-
raise e
|
295
|
-
ensure
|
296
|
-
config.after_rollback[@deploy_exception] if config
|
297
|
-
config.after_deploy_or_rollback[@deploy_exception] if config
|
298
|
-
puts "=> Done."
|
198
|
+
deploy_or_rollback(:rollback, package)
|
299
199
|
end
|
300
200
|
|
301
201
|
desc "join HOST", "let serf to join to HOST"
|
@@ -311,7 +211,11 @@ not distributed: #{dist['not_distributed_count']} agents
|
|
311
211
|
end
|
312
212
|
|
313
213
|
def application
|
314
|
-
|
214
|
+
@_application ||=
|
215
|
+
ENV['MAMIYA_APP'] \
|
216
|
+
|| ENV['MAMIYA_APPLICATION'] \
|
217
|
+
|| options[:application] \
|
218
|
+
or fatal!('specify application')
|
315
219
|
end
|
316
220
|
|
317
221
|
def config
|
@@ -365,6 +269,88 @@ not distributed: #{dist['not_distributed_count']} agents
|
|
365
269
|
p master_post("/packages/#{application}/#{package}/switch", params.merge(type: :json))
|
366
270
|
end
|
367
271
|
|
272
|
+
def deploy_or_rollback(type, package)
|
273
|
+
@deploy_exception = nil
|
274
|
+
synced_release = options[:synced_release] || (config && config.synced_release)
|
275
|
+
|
276
|
+
# TODO: move this run on master node side
|
277
|
+
if type == :deploy
|
278
|
+
puts "=> Deploying #{application}/#{package}"
|
279
|
+
else
|
280
|
+
puts "=> Rolling back #{application} to #{package}"
|
281
|
+
end
|
282
|
+
puts " * onto agents which labeled: #{options[:labels].inspect}" if options[:labels] && !options[:labels].empty?
|
283
|
+
puts " * releasing will be synced in all agents" if synced_release
|
284
|
+
|
285
|
+
show_package(package)
|
286
|
+
|
287
|
+
if config
|
288
|
+
config.set :application, application
|
289
|
+
config.set :package_name, package
|
290
|
+
config.set :package, @meta
|
291
|
+
|
292
|
+
config.before_deploy_or_rollback[]
|
293
|
+
(type == :deploy ? config.before_deploy : config.before_rollback)[]
|
294
|
+
end
|
295
|
+
|
296
|
+
if type == :deploy
|
297
|
+
do_prep = -> do
|
298
|
+
puts "=> Preparing..."
|
299
|
+
prepare(package)
|
300
|
+
end
|
301
|
+
|
302
|
+
do_prep[]
|
303
|
+
|
304
|
+
puts " * Wait until prepared"
|
305
|
+
puts ""
|
306
|
+
|
307
|
+
i = 0
|
308
|
+
loop do
|
309
|
+
i += 1
|
310
|
+
do_prep[] if i % 25 == 0
|
311
|
+
|
312
|
+
s = pkg_status(package, :short)
|
313
|
+
puts ""
|
314
|
+
break if 0 < s['participants_count'] && s['non_participants'].empty? && s['participants_count'] == s['prepare']['done'].size
|
315
|
+
sleep 2
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
###
|
320
|
+
#
|
321
|
+
|
322
|
+
unless options[:no_switch]
|
323
|
+
puts "=> Switching..."
|
324
|
+
switch_(package, no_release: synced_release)
|
325
|
+
|
326
|
+
puts " * Wait until switch"
|
327
|
+
puts ""
|
328
|
+
loop do
|
329
|
+
s = pkg_status(package, :short)
|
330
|
+
puts ""
|
331
|
+
break if s['participants_count'] == s['switch']['done'].size
|
332
|
+
sleep 2
|
333
|
+
end
|
334
|
+
|
335
|
+
if synced_release
|
336
|
+
puts "=> Releasing..."
|
337
|
+
switch_(package, do_release: true)
|
338
|
+
|
339
|
+
puts " * due to current implementation's limitation, releasing will be untracked."
|
340
|
+
end
|
341
|
+
end
|
342
|
+
rescue Exception => e
|
343
|
+
@deploy_exception = e
|
344
|
+
$stderr.puts "ERROR: #{e.inspect}"
|
345
|
+
$stderr.puts "\t#{e.backtrace.join("\n\t")}"
|
346
|
+
ensure
|
347
|
+
|
348
|
+
(type == :deploy ? config.after_deploy : config.after_rollback)[@deploy_exception] if config
|
349
|
+
config.after_deploy_or_rollback[@deploy_exception] if config
|
350
|
+
puts "=> Done."
|
351
|
+
|
352
|
+
end
|
353
|
+
|
368
354
|
def master_http
|
369
355
|
url = master_url
|
370
356
|
Net::HTTP.new(url.host, url.port).tap do |http|
|
@@ -75,8 +75,12 @@ module Mamiya
|
|
75
75
|
def task___switch__finish(status, task)
|
76
76
|
status['currents'] ||= {}
|
77
77
|
status['currents'][task['app']] = task['pkg']
|
78
|
-
end
|
79
78
|
|
79
|
+
status['releases'] ||= {}
|
80
|
+
status['releases'][task['app']] ||= []
|
81
|
+
status['releases'][task['app']].push task['pkg']
|
82
|
+
status['releases'][task['app']].uniq!
|
83
|
+
end
|
80
84
|
|
81
85
|
def pkg__remove(status, payload, event)
|
82
86
|
status['packages'] ||= {}
|
data/lib/mamiya/version.rb
CHANGED
@@ -714,7 +714,7 @@ describe Mamiya::Master::AgentMonitor do
|
|
714
714
|
describe "switch" do
|
715
715
|
describe "success" do
|
716
716
|
let(:status) do
|
717
|
-
{currents: {}}
|
717
|
+
{currents: {}, releases: {}}
|
718
718
|
end
|
719
719
|
|
720
720
|
it "updates current" do
|
@@ -724,6 +724,40 @@ describe Mamiya::Master::AgentMonitor do
|
|
724
724
|
expect(new_status["currents"]['myapp']).to eq "pkg"
|
725
725
|
end
|
726
726
|
|
727
|
+
it "adds release" do
|
728
|
+
commit('mamiya:task:finish',
|
729
|
+
task: {task: 'switch', app: 'myapp', pkg: 'pkg'})
|
730
|
+
|
731
|
+
expect(new_status["releases"]['myapp']).to eq ["pkg"]
|
732
|
+
end
|
733
|
+
|
734
|
+
context "with existing release" do
|
735
|
+
let(:status) do
|
736
|
+
{currents: {}, releases: {'myapp' => ['pkg2']}}
|
737
|
+
end
|
738
|
+
|
739
|
+
it "adds release" do
|
740
|
+
commit('mamiya:task:finish',
|
741
|
+
task: {task: 'switch', app: 'myapp', pkg: 'pkg'})
|
742
|
+
|
743
|
+
expect(new_status["releases"]['myapp']).to eq ["pkg2", 'pkg']
|
744
|
+
end
|
745
|
+
end
|
746
|
+
|
747
|
+
|
748
|
+
context "with release with same name" do
|
749
|
+
let(:status) do
|
750
|
+
{currents: {}, releases: {'myapp' => ['pkg2', 'pkg']}}
|
751
|
+
end
|
752
|
+
|
753
|
+
it "adds release" do
|
754
|
+
commit('mamiya:task:finish',
|
755
|
+
task: {task: 'switch', app: 'myapp', pkg: 'pkg'})
|
756
|
+
|
757
|
+
expect(new_status["releases"]['myapp']).to eq ["pkg2", "pkg"]
|
758
|
+
end
|
759
|
+
end
|
760
|
+
|
727
761
|
context "with existing current" do
|
728
762
|
let(:status) do
|
729
763
|
{currents: {'myapp' => 'pkg1'}}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mamiya
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shota Fukumori (sora_h)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
11
|
+
date: 2014-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|