kumogata2 0.1.13 → 0.1.14

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2a6375690f35aec4560bf2e6848e5daaef2966d3
4
- data.tar.gz: 44aeb6b03b43f65979ac7818bf089b635b8cd818
3
+ metadata.gz: 6db4a45c394094f8864f856bfd395f6f241ced59
4
+ data.tar.gz: 770e9b3fed15e232d59bd13bac0bf7aebc619c28
5
5
  SHA512:
6
- metadata.gz: 4b57e5de6afc179afbcf3ac46b4fa6a927ca6654a0a8eaa41a1e61920fce58637bcd04e92b3685d8fb6e249d4abb6f4bb35cca3bfef5ec28b93b0460e20ecf5b
7
- data.tar.gz: 62a5dd5f4d3d359c61fcd53006eb5366bf1f062876484d17824dfe7a82cb8da8f32a3c874c26af95a62a0d465bb3971381a83c8118acc66c27cb31fd9f61b808
6
+ metadata.gz: d7791866506cd56ca7ed5be88e0ab6b619140ae5cb245abbd66fa970056289771219edd834bcef14bd2e9f08df9b4db357fae803c9bc61f6a058b3407662e9f3
7
+ data.tar.gz: 02d7c9156d0acd8d96c67a18e83071fdfc24dd7e984a3cbf22590062f8877effd5a0fcc5ad50f9c58107c7444529a6caea91faf3b359356a94db6d6b06ba859c
data/README.md CHANGED
@@ -32,6 +32,7 @@ Commands:
32
32
  create PATH_OR_URL [STACK_NAME] Create resources as specified in the template
33
33
  update PATH_OR_URL STACK_NAME Update a stack as specified in the template
34
34
  delete STACK_NAME Delete a specified stack
35
+ deploy PATH_OR_URL STACK_NAME Create a change set and executes it
35
36
  validate PATH_OR_URL Validate a specified template
36
37
  list [STACK_NAME] List summary information for stacks
37
38
  export STACK_NAME Export a template from a specified stack
@@ -25,6 +25,11 @@ module Kumogata2::CLI
25
25
  arguments: [:stack_name],
26
26
  output: false,
27
27
  },
28
+ deploy: {
29
+ description: 'Create a change set and executes it',
30
+ arguments: [:path_or_url, :stack_name],
31
+ output: false,
32
+ },
28
33
  validate: {
29
34
  description: 'Validate a specified template',
30
35
  arguments: [:path_or_url],
@@ -145,11 +150,6 @@ module Kumogata2::CLI
145
150
 
146
151
  opt.parse!
147
152
 
148
- # https://github.com/aws/aws-sdk-ruby/blob/v2.3.11/aws-sdk-core/lib/aws-sdk-core/plugins/regional_endpoint.rb#L29
149
- unless options[:aws][:region]
150
- raise "missing region; use '--region' option or export region name to ENV['AWS_REGION']"
151
- end
152
-
153
153
  unless (command = argv.shift)
154
154
  puts opt.help
155
155
  exit_parse!(1)
@@ -51,6 +51,16 @@ class Kumogata2::Client
51
51
  end
52
52
  end
53
53
 
54
+ def deploy(path_or_url, stack_name = nil)
55
+ stack_name = normalize_stack_name(stack_name)
56
+ validate_stack_name(stack_name) if stack_name
57
+ template = open_template(path_or_url)
58
+ update_deletion_policy(template, delete_stack: !stack_name)
59
+
60
+ change_set = create_change_set(template, stack_name)
61
+ execute_change_set(change_set)
62
+ end
63
+
54
64
  def validate(path_or_url)
55
65
  template = open_template(path_or_url)
56
66
  validate_template(template)
@@ -150,6 +160,12 @@ class Kumogata2::Client
150
160
 
151
161
  def get_client
152
162
  return @client unless @client.nil?
163
+
164
+ # https://github.com/aws/aws-sdk-ruby/blob/v2.3.11/aws-sdk-core/lib/aws-sdk-core/plugins/regional_endpoint.rb#L29
165
+ unless @options[:aws][:region]
166
+ raise "missing region; use '--region' option or export region name to ENV['AWS_REGION']"
167
+ end
168
+
153
169
  @client = Aws::CloudFormation::Client.new(@options.aws)
154
170
  end
155
171
 
@@ -283,7 +299,7 @@ class Kumogata2::Client
283
299
  raise_stack_error!(stack, 'Delete failed')
284
300
  end
285
301
 
286
- log(:info, 'Success')
302
+ log(:info, 'Delete stack successfully')
287
303
  end
288
304
 
289
305
  def validate_template(template)
@@ -312,17 +328,35 @@ class Kumogata2::Client
312
328
  JSON.parse(template)
313
329
  end
314
330
 
315
- def show_change_set(template, stack_name)
316
- output = nil
331
+ def create_change_set(template, stack_name)
317
332
  change_set_name = [stack_name, SecureRandom.uuid].join('-')
318
333
 
319
- log(:info, "Creating ChangeSet: #{change_set_name}", color: :cyan)
334
+ begin
335
+ stack = describe_stack(stack_name)
336
+ case stack[:stack_status]
337
+ when /_FAILED\z/
338
+ log(:error, "Stack #{stack_name} status is now failed - #{stack[:stack_status]}", color: :red)
339
+ return
340
+ when /^DELETE_/
341
+ log(:error, "Stack #{stack_name} statis is now delete - #{stack[:stack_status]}", color: :red)
342
+ return
343
+ when 'REVIEW_IN_PROGRESS'
344
+ change_set_type = 'CREATE'
345
+ else
346
+ change_set_type = 'UPDATE'
347
+ end
348
+ rescue
349
+ change_set_type = 'CREATE'
350
+ end
351
+
352
+ log(:info, "Creating ChangeSet: #{change_set_name} for #{stack_name}", color: :cyan)
320
353
 
321
354
  params = {
322
355
  stack_name: stack_name,
323
356
  change_set_name: change_set_name,
324
357
  template_body: convert_output_value(template),
325
358
  parameters: parameters_array,
359
+ change_set_type: change_set_type,
326
360
  }
327
361
 
328
362
  params.merge!(set_api_params(params,
@@ -337,26 +371,62 @@ class Kumogata2::Client
337
371
 
338
372
  completed, change_set = wait_change_set(change_set_arn, 'CREATE_COMPLETE')
339
373
 
340
- if completed
341
- output = changes_for(change_set)
342
- else
374
+ unless completed
343
375
  log(:error, "Create ChangeSet failed: #{change_set.status_reason}", color: :red)
344
376
  end
345
377
 
346
- log(:info, "Deleting ChangeSet: #{change_set_name}", color: :red)
378
+ change_set
379
+ end
380
+
381
+ def execute_change_set(change_set)
382
+ if change_set.status != 'CREATE_COMPLETE'
383
+ log(:info, "ChangeSet status is #{change_set.status}", color: :red)
384
+ delete_change_set(change_set)
385
+ return
386
+ end
387
+
388
+ log(:info, "Executing ChangeSet: #{change_set.change_set_name} for #{change_set.stack_name}", color: :cyan)
389
+
390
+ get_client.execute_change_set(change_set_name: change_set.change_set_name,
391
+ stack_name: change_set.stack_name)
392
+
393
+ stack = get_resource.stack(change_set.stack_name)
394
+
395
+ event_log = create_event_log(stack)
396
+
397
+ completed = wait(stack, stack.stack_status, event_log)
398
+
399
+ unless completed
400
+ raise_stack_error!(stack, 'executing change set failed')
401
+ end
402
+ end
403
+
404
+ def delete_change_set(change_set)
405
+ log(:info, "Deleting ChangeSet: #{change_set.change_set_name}", color: :red)
347
406
 
348
- get_client.delete_change_set(change_set_name: change_set_arn)
407
+ get_client.delete_change_set(stack_name: change_set.stack_name,
408
+ change_set_name: change_set.change_set_id)
349
409
 
350
410
  begin
351
- completed, _ = wait_change_set(change_set_arn, 'DELETE_COMPLETE')
411
+ completed, _ = wait_change_set(change_set.change_set_id, 'DELETE_COMPLETE')
352
412
  rescue Aws::CloudFormation::Errors::ChangeSetNotFound
353
413
  # Handle `ChangeSet does not exist`
354
414
  completed = true
355
415
  end
356
416
 
357
- unless completed
358
- log(:error, "Delete ChangeSet failed: #{change_set.status_reason}", color: :red)
359
- end
417
+ completed
418
+ end
419
+
420
+ def show_change_set(template, stack_name)
421
+ output = nil
422
+
423
+ change_set = create_change_set(template, stack_name)
424
+ output = changes_for(change_set) unless change_set.nil?
425
+
426
+ delete_change_set(change_set)
427
+
428
+ stack = get_resource.stack(stack_name)
429
+ delete_stack(stack_name) if stack.stack_status == 'REVIEW_IN_PROGRESS'
360
430
 
361
431
  output
362
432
  end
@@ -1,3 +1,3 @@
1
1
  module Kumogata2
2
- VERSION = '0.1.13'
2
+ VERSION = '0.1.14'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kumogata2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.13
4
+ version: 0.1.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genki Sugawara
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-07-18 00:00:00.000000000 Z
11
+ date: 2017-07-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk