cfndk 0.0.7 → 0.1.2

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.
Files changed (78) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +79 -0
  3. data/.gitignore +1 -1
  4. data/.rspec +2 -0
  5. data/.rspec_parallel +6 -0
  6. data/.simplecov +9 -0
  7. data/Gemfile +11 -1
  8. data/Gemfile.lock +815 -0
  9. data/README.md +269 -76
  10. data/bin/cfndk +3 -18
  11. data/cfndk.gemspec +15 -6
  12. data/docker/Dockerfile +8 -0
  13. data/docker/build.sh +3 -0
  14. data/docker/cfndk.sh +14 -0
  15. data/lib/cfndk.rb +36 -0
  16. data/lib/cfndk/change_set_command.rb +103 -0
  17. data/lib/cfndk/command.rb +125 -119
  18. data/lib/cfndk/config_file_loadable.rb +13 -0
  19. data/lib/cfndk/credential_provider_chain.rb +12 -42
  20. data/lib/cfndk/credential_resolvable.rb +10 -0
  21. data/lib/cfndk/diff.rb +38 -0
  22. data/lib/cfndk/global_config.rb +46 -0
  23. data/lib/cfndk/key_pair.rb +66 -14
  24. data/lib/cfndk/key_pair_command.rb +60 -0
  25. data/lib/cfndk/key_pairs.rb +22 -5
  26. data/lib/cfndk/logger.rb +12 -3
  27. data/lib/cfndk/stack.rb +427 -126
  28. data/lib/cfndk/stack_command.rb +128 -0
  29. data/lib/cfndk/stacks.rb +48 -22
  30. data/lib/cfndk/subcommand_help_returnable.rb +16 -0
  31. data/lib/cfndk/template_packager.rb +210 -0
  32. data/lib/cfndk/uuid.rb +10 -0
  33. data/lib/cfndk/version.rb +1 -1
  34. data/skel/cfndk.yml +4 -0
  35. data/spec/.gitignore +1 -0
  36. data/spec/cfndk_change_set_create_spec.rb +436 -0
  37. data/spec/cfndk_change_set_destroy_spec.rb +160 -0
  38. data/spec/cfndk_change_set_execute_spec.rb +179 -0
  39. data/spec/cfndk_change_set_report_spec.rb +107 -0
  40. data/spec/cfndk_change_set_spec.rb +37 -0
  41. data/spec/cfndk_create_spec.rb +504 -0
  42. data/spec/cfndk_destroy_spec.rb +148 -0
  43. data/spec/cfndk_keypiar_spec.rb +397 -0
  44. data/spec/cfndk_report_spec.rb +164 -0
  45. data/spec/cfndk_spec.rb +103 -0
  46. data/spec/cfndk_stack_create_spec.rb +814 -0
  47. data/spec/cfndk_stack_destroy_spec.rb +225 -0
  48. data/spec/cfndk_stack_report_spec.rb +181 -0
  49. data/spec/cfndk_stack_spec.rb +133 -0
  50. data/spec/cfndk_stack_update_spec.rb +553 -0
  51. data/spec/fixtures/big_vpc.yaml +533 -0
  52. data/spec/fixtures/empty_resource.yaml +2 -0
  53. data/spec/fixtures/iam.json +8 -0
  54. data/spec/fixtures/iam.yaml +38 -0
  55. data/spec/fixtures/iam_different.json +8 -0
  56. data/spec/fixtures/invalid_vpc.yaml +21 -0
  57. data/spec/fixtures/lambda_function/index.js +4 -0
  58. data/spec/fixtures/lambda_function/lambda_function.json +4 -0
  59. data/spec/fixtures/lambda_function/lambda_function.yaml +28 -0
  60. data/spec/fixtures/nested_stack.json +35 -0
  61. data/spec/fixtures/nested_stack.yaml +20 -0
  62. data/spec/fixtures/serverless_function/index.js +4 -0
  63. data/spec/fixtures/serverless_function/serverless_function.json +4 -0
  64. data/spec/fixtures/serverless_function/serverless_function.yaml +21 -0
  65. data/spec/fixtures/sg.json +8 -0
  66. data/spec/fixtures/sg.yaml +27 -0
  67. data/spec/fixtures/sg_different.yaml +22 -0
  68. data/spec/fixtures/stack.json +8 -0
  69. data/spec/fixtures/stack.template.json +39 -0
  70. data/spec/fixtures/stack.yaml +22 -0
  71. data/spec/fixtures/vpc.json +8 -0
  72. data/spec/fixtures/vpc.template.json +40 -0
  73. data/spec/fixtures/vpc.yaml +21 -0
  74. data/spec/fixtures/vpc_different.yaml +21 -0
  75. data/spec/spec_helper.rb +14 -0
  76. data/spec/support/aruba.rb +6 -0
  77. data/vagrant/Vagrantfile +89 -0
  78. metadata +259 -31
data/bin/cfndk CHANGED
@@ -1,22 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'bundler/setup'
4
-
5
- require 'rainbow/ext/string'
6
- require 'optparse'
7
- require 'fileutils'
8
- require 'pathname'
9
- require 'erb'
10
- require 'yaml'
11
- require 'json'
12
- require 'aws-sdk'
13
- require 'terminal-table'
14
- require 'securerandom'
15
- require 'logger'
16
-
17
- require 'cfndk.rb'
18
-
19
3
  $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
20
4
 
21
- c = CFnDK::Command.new
22
- exit c.execute
5
+ require 'cfndk'
6
+
7
+ exit CFnDK::Command.start(ARGV)
@@ -18,11 +18,20 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_development_dependency 'bundler', '~> 1.7'
22
- spec.add_development_dependency 'rake', '~> 11.1.2'
21
+ spec.add_development_dependency 'rake'
22
+ spec.add_development_dependency 'rspec'
23
+ spec.add_development_dependency 'aruba'
24
+ spec.add_development_dependency 'simplecov'
25
+ spec.add_development_dependency 'awspec'
26
+ spec.add_development_dependency 'parallel_tests'
23
27
 
24
- spec.add_dependency 'rainbow', '~> 3.0.0'
25
- spec.add_dependency 'aws-sdk', '~> 3'
26
- spec.add_dependency 'camelizable', '~> 0.0.3'
27
- spec.add_dependency 'terminal-table', '~> 1'
28
+ spec.add_dependency 'bundler'
29
+ spec.add_dependency 'thor'
30
+ spec.add_dependency 'rainbow'
31
+ spec.add_dependency 'rubyzip', '1.3.0'
32
+ spec.add_dependency 'aws-sdk'
33
+ spec.add_dependency 'camelizable'
34
+ spec.add_dependency 'terminal-table'
35
+ spec.add_dependency 'diff-lcs'
36
+ spec.add_dependency 'polyfill'
28
37
  end
@@ -0,0 +1,8 @@
1
+ FROM ruby:2.6-alpine
2
+
3
+ RUN gem install bundler --version 1.14.6
4
+ RUN gem install cfndk
5
+
6
+ WORKDIR /home/cfndk
7
+ ENTRYPOINT ["sh", "-c", "cfndk $@", ""]
8
+ CMD ["help"]
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+
3
+ docker build -t cfndk:latest ./
@@ -0,0 +1,14 @@
1
+ #!/bin/bash
2
+
3
+ WORK_DIR=`pwd`
4
+
5
+ docker run \
6
+ -v $WORK_DIR:/home/cfndk \
7
+ -v $HOME/.aws:/root/.aws \
8
+ -e AWS_PROFILE=$AWS_PROFILE \
9
+ -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
10
+ -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
11
+ -e AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN \
12
+ -w /home/cfndk \
13
+ -it amakata/cfndk:latest \
14
+ "$@"
@@ -1,12 +1,48 @@
1
+ require 'bundler/setup'
2
+
3
+ require 'rainbow/ext/string'
4
+ require 'camelizable'
5
+ require 'fileutils'
6
+ require 'pathname'
7
+ require 'ostruct'
8
+ require 'erb'
9
+ require 'yaml'
10
+ require 'json'
11
+ require 'zip'
12
+ require 'aws-sdk'
13
+ require 'terminal-table'
14
+ require 'securerandom'
15
+ require 'logger'
16
+ require 'thor'
17
+ require 'diff/lcs'
18
+ require 'diff/lcs/hunk'
19
+ require 'polyfill'
20
+
21
+ if ENV['CFNDK_COVERAGE']
22
+ require 'simplecov'
23
+ root = File.expand_path('../../', __FILE__)
24
+ SimpleCov.root(root)
25
+ end
26
+
1
27
  require 'cfndk/version'
2
28
  require 'cfndk/stack'
3
29
  require 'cfndk/stacks'
4
30
  require 'cfndk/key_pair'
5
31
  require 'cfndk/key_pairs'
6
32
  require 'cfndk/erb_string'
33
+ require 'cfndk/global_config'
7
34
  require 'cfndk/logger'
8
35
  require 'cfndk/credential_provider_chain'
36
+ require 'cfndk/subcommand_help_returnable'
37
+ require 'cfndk/credential_resolvable'
38
+ require 'cfndk/config_file_loadable'
39
+ require 'cfndk/key_pair_command'
40
+ require 'cfndk/stack_command'
41
+ require 'cfndk/change_set_command'
9
42
  require 'cfndk/command'
43
+ require 'cfndk/template_packager'
44
+ require 'cfndk/diff'
45
+ require 'cfndk/uuid'
10
46
 
11
47
  module CFnDK
12
48
  end
@@ -0,0 +1,103 @@
1
+ module CFnDK
2
+ class ChangeSetCommand < Thor
3
+ include SubcommandHelpReturnable
4
+ include ConfigFileLoadable
5
+ include CredentialResolvable
6
+
7
+ class_option :verbose, type: :boolean, aliases: 'v', desc: 'More verbose output.'
8
+ class_option :color, type: :boolean, default: true, desc: 'Use colored output'
9
+ class_option :config_path, type: :string, aliases: 'c', default: "#{Dir.getwd}/cfndk.yml", desc: 'The configuration file to use'
10
+ class_option :stack_names, type: :array, aliases: 's', desc: 'Target stack names'
11
+
12
+ desc 'create', 'Create change set'
13
+ option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
14
+ option :change_set_uuid, type: :string, default: ENV['CFNDK_CHANGE_SET_UUID'] || nil, desc: 'Use Change Set UUID'
15
+ option :properties, type: :hash, aliases: 'p', default: {}, desc: 'Set property'
16
+ def create
17
+ CFnDK.logger.info 'create...'.color(:green)
18
+ data = load_config_data(options)
19
+ credentials = resolve_credential(data, options)
20
+ global_config = CFnDK::GlobalConfig.new(data, options)
21
+ stacks = CFnDK::Stacks.new(data, options, credentials)
22
+
23
+ global_config.pre_command_execute
24
+ stacks.pre_command_execute
25
+ stacks.validate
26
+ stacks.create_change_set
27
+ stacks.post_command_execute
28
+ global_config.post_command_execute
29
+ return 0
30
+ rescue => e
31
+ CFnDK.logger.error "#{e.class}: #{e.message}".color(:red)
32
+ e.backtrace_locations.each do |line|
33
+ CFnDK.logger.debug line
34
+ end
35
+ return 1
36
+ end
37
+
38
+ desc 'execute', 'Execute change set'
39
+ option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
40
+ option :change_set_uuid, type: :string, default: ENV['CFNDK_CHANGE_SET_UUID'] || nil, desc: 'Use Change Set UUID'
41
+ def execute
42
+ CFnDK.logger.info 'execute...'.color(:green)
43
+ data = load_config_data(options)
44
+ credentials = resolve_credential(data, options)
45
+ stacks = CFnDK::Stacks.new(data, options, credentials)
46
+
47
+ stacks.execute_change_set
48
+ return 0
49
+ rescue => e
50
+ CFnDK.logger.error "#{e.class}: #{e.message}".color(:red)
51
+ e.backtrace_locations.each do |line|
52
+ CFnDK.logger.debug line
53
+ end
54
+ return 1
55
+ end
56
+
57
+ desc 'destroy', 'Destroy change set'
58
+ option :force, type: :boolean, aliases: 'f', default: false, desc: 'Say yes to all prompts for confirmation'
59
+ option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
60
+ option :change_set_uuid, type: :string, default: ENV['CFNDK_CHANGE_SET_UUID'] || nil, desc: 'Use Change Set UUID'
61
+ def destroy
62
+ CFnDK.logger.info 'destroy...'.color(:green)
63
+ data = load_config_data(options)
64
+ credentials = resolve_credential(data, options)
65
+
66
+ stacks = CFnDK::Stacks.new(data, options, credentials)
67
+
68
+ if options[:force] || yes?('Are you sure you want to destroy? (y/n)', :yellow)
69
+ stacks.delete_change_set
70
+ return 0
71
+ else
72
+ CFnDK.logger.info 'destroy command was canceled'.color(:green)
73
+ return 2
74
+ end
75
+ rescue => e
76
+ CFnDK.logger.error "#{e.class}: #{e.message}".color(:red)
77
+ e.backtrace_locations.each do |line|
78
+ CFnDK.logger.debug line
79
+ end
80
+ return 1
81
+ end
82
+
83
+ desc 'report', 'Report change set'
84
+ option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
85
+ option :change_set_uuid, type: :string, default: ENV['CFNDK_CHANGE_SET_UUID'] || nil, desc: 'Use Change Set UUID'
86
+ option :types, type: :array, default: %w(tag parameter changes), desc: 'Report type'
87
+ def report
88
+ CFnDK.logger.info 'report...'.color(:green)
89
+ data = load_config_data(options)
90
+ credentials = resolve_credential(data, options)
91
+
92
+ stacks = CFnDK::Stacks.new(data, options, credentials)
93
+ stacks.report_change_set
94
+ return 0
95
+ rescue => e
96
+ CFnDK.logger.error "#{e.class}: #{e.message}".color(:red)
97
+ e.backtrace_locations.each do |line|
98
+ CFnDK.logger.debug line
99
+ end
100
+ return 1
101
+ end
102
+ end
103
+ end
@@ -1,136 +1,142 @@
1
1
  module CFnDK
2
- class Command
3
- def initialize
4
- @cur_dir = Dir.getwd
5
- @option = {
6
- config_path: "#{@cur_dir}/cfndk.yml",
7
- uuid: ENV['CFNDK_UUID'] || nil,
8
- properties: {},
9
- stack_names: nil,
10
- force: false,
11
- }
12
-
13
- @opt = OptionParser.new do |o|
14
- o.version = CFnDK::VERSION
15
- o.summary_indent = ' ' * 4
16
- o.banner = "Version: #{CFnDK::VERSION} \nUsage: cfndk [cmd] [options]"
17
- o.on_head('[cmd]',
18
- ' init create config YAML file',
19
- ' create create stacks',
20
- ' update update stacks',
21
- ' create-or-changeset create stacks or create changeset',
22
- ' destroy destroy stacks',
23
- ' generate-uuid generate UUID',
24
- ' report-event report stack event',
25
- ' report-stack report stack',
26
- ' report-stack-resource report stack resource',
27
- '[enviroment variables]',
28
- " AWS_PROFILE: #{ENV['AWS_PROFILE']}",
29
- " AWS_DEFAULT_REGION: #{ENV['AWS_DEFAULT_REGION']}",
30
- " AWS_REGION: #{ENV['AWS_REGION']}",
31
- " AWS_ACCESS_KEY_ID: #{ENV['AWS_ACCESS_KEY_ID']}",
32
- " AWS_SECRET_ACCESS_KEY: #{ENV['AWS_SECRET_ACCESS_KEY']}",
33
- " AWS_SESSION_TOKEN: #{ENV['AWS_SECRET_ACCESS_KEY']}",
34
- " AWS_CONTAINER_CREDENTIALS_RELATIVE_URI: #{ENV['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI']}",
35
- '[options]')
36
- o.on('-v', '--verbose', 'verbose mode') { |v| @option[:v] = v }
37
- o.on('-c', '--config_path cfndi.yml', "config path (default: #{@option[:config_path]})") { |v| @option[:config_path] = v }
38
- o.on('-p', '--properties name=value', 'properties') do |v|
39
- md = v.match(/^([a-zA-Z_]+[a-zA-Z0-9_]*)=(.*)$/)
40
- if md
41
- @option[:properties][md[0]] = md[1]
42
- else
43
- raise "invalid properties: '#{v}'" unless md
44
- end
45
- end
46
- o.on('-a', '--auto-uuid') { @option[:uuid] = SecureRandom.uuid }
47
- o.on('-u', '--uuid uuid') { |v| @option[:uuid] = v }
48
- o.on('-n', '--stack-names name1,name2') { |v| @option[:stack_names] = v.split(/\s*,\s*/) }
49
- o.on('--no-color') { |b| Rainbow.enabled = false }
50
- o.on('-f', '--force') { |b| @option[:force] = true }
51
- o.permute!(ARGV)
2
+ class Command < Thor
3
+ include Thor::Actions
4
+ include ConfigFileLoadable
5
+ include CredentialResolvable
6
+
7
+ class << self
8
+ def exit_on_failure?
9
+ true
52
10
  end
53
- @logger = CFnDK::Logger.new(@option)
54
11
  end
55
12
 
56
- def execute
57
- if ARGV.length != 1
58
- puts @opt.help
59
- return 2
60
- elsif ARGV[0] == 'generate-uuid'
61
- puts SecureRandom.uuid
62
- return 0
63
- elsif ARGV[0] == 'init'
64
- if File.file?(@option[:config_path])
65
- @logger.error "File exist. #{@option[:config_path]}".color(:red)
66
- return 1
67
- end
68
- @logger.info 'init...'.color(:green)
69
- FileUtils.cp_r(Dir.glob(File.dirname(__FILE__) + '/../../skel/*'), './')
70
- @logger.info "create #{@option[:config_path]}".color(:green)
71
- return 0
72
- end
13
+ def help(command = nil, subcommand = false)
14
+ super(command, subcommand)
15
+ 2
16
+ end
73
17
 
74
- unless File.file?(@option[:config_path])
75
- @logger.error "File does not exist. #{@option[:config_path]}".color(:red)
18
+ class_option :verbose, type: :boolean, aliases: 'v', desc: 'More verbose output.'
19
+ class_option :color, type: :boolean, default: true, desc: 'Use colored output'
20
+
21
+ desc 'generate-uuid', 'Print UUID'
22
+ def generate_uuid
23
+ puts SecureRandom.uuid
24
+ 0
25
+ end
26
+
27
+ desc 'version', 'Print version'
28
+ def version
29
+ puts CFnDK::VERSION
30
+ 0
31
+ end
32
+
33
+ desc 'init', 'Craete sample cfndk.yml & CloudFormation yaml & json files.'
34
+ def init
35
+ config_path = "#{Dir.getwd}/cfndk.yml"
36
+ if File.file?(config_path)
37
+ CFnDK.logger.error "File exist. #{config_path}".color(:red)
76
38
  return 1
77
39
  end
40
+ CFnDK.logger.info 'init...'.color(:green)
41
+ FileUtils.cp_r(Dir.glob(File.dirname(__FILE__) + '/../../skel/*'), './')
42
+ CFnDK.logger.info "create #{config_path}".color(:green)
43
+ end
44
+
45
+ desc 'create', 'Create keypair & stack'
46
+ option :config_path, type: :string, aliases: 'c', default: "#{Dir.getwd}/cfndk.yml", desc: 'The configuration file to use'
47
+ option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
48
+ option :properties, type: :hash, aliases: 'p', default: {}, desc: 'Set property'
49
+ option :stack_names, type: :array, aliases: 's', desc: 'Target stack names'
50
+ option :keypair_names, type: :array, desc: 'Target keypair names'
51
+ def create
52
+ CFnDK.logger.info 'create...'.color(:green)
53
+ data = load_config_data(options)
54
+ credentials = resolve_credential(data, options)
55
+ global_config = CFnDK::GlobalConfig.new(data, options)
56
+ stacks = CFnDK::Stacks.new(data, options, credentials)
57
+ keypairs = CFnDK::KeyPairs.new(data, options, credentials)
78
58
 
79
- data = open(@option[:config_path], 'r') { |f| YAML.load(f) } if File.file?(@option[:config_path])
80
- credentials = CFnDK::CredentialProviderChain.new.resolve
81
- stacks = CFnDK::Stacks.new(data, @option, credentials)
82
- keypairs = CFnDK::KeyPairs.new(data, @option, credentials)
83
-
84
- if ARGV[0] == 'create'
85
- @logger.info 'create...'.color(:green)
86
- stacks.validate
87
- keypairs.create
88
- stacks.create
89
- elsif ARGV[0] == 'update'
90
- @logger.info 'update...'.color(:green)
91
- stacks.validate
92
- stacks.update
93
- elsif ARGV[0] == 'create-or-changeset'
94
- @logger.info 'create or changeset...'.color(:green)
95
- stacks.validate
96
- stacks.create_or_changeset
97
- elsif ARGV[0] == 'destroy'
98
- @logger.info 'destroy...'.color(:green)
99
- if destroy?
100
- stacks.destroy
101
- keypairs.destroy
102
- end
103
- elsif ARGV[0] == 'validate'
104
- @logger.info 'validate...'.color(:green)
105
- stacks.validate
106
- elsif ARGV[0] == 'report-event'
107
- @logger.info 'report event...'.color(:green)
108
- stacks.report_event
109
- elsif ARGV[0] == 'report-stack'
110
- @logger.info 'report stack...'.color(:green)
111
- stacks.report_stack
112
- elsif ARGV[0] == 'report-stack-resource'
113
- @logger.info 'report stack resource...'.color(:green)
114
- stacks.report_stack_resource
59
+ global_config.pre_command_execute
60
+ stacks.pre_command_execute
61
+ stacks.validate
62
+ keypairs.pre_command_execute
63
+ keypairs.create
64
+ keypairs.post_command_execute
65
+ stacks.create
66
+ stacks.post_command_execute
67
+ global_config.post_command_execute
68
+ return 0
69
+ rescue => e
70
+ CFnDK.logger.error "#{e.class}: #{e.message}".color(:red)
71
+ e.backtrace_locations.each do |line|
72
+ CFnDK.logger.debug line
73
+ end
74
+ return 1
75
+ end
76
+
77
+ desc 'destroy', 'Destroy keypair & stack'
78
+ option :config_path, type: :string, aliases: 'c', default: "#{Dir.getwd}/cfndk.yml", desc: 'The configuration file to use'
79
+ option :force, type: :boolean, aliases: 'f', default: false, desc: 'Say yes to all prompts for confirmation'
80
+ option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
81
+ def destroy
82
+ CFnDK.logger.info 'destroy...'.color(:green)
83
+ data = load_config_data(options)
84
+ credentials = resolve_credential(data, options)
85
+
86
+ stacks = CFnDK::Stacks.new(data, options, credentials)
87
+ keypairs = CFnDK::KeyPairs.new(data, options, credentials)
88
+
89
+ if options[:force] || yes?('Are you sure you want to destroy? (y/n)', :yellow)
90
+ stacks.destroy
91
+ keypairs.destroy
92
+ return 0
115
93
  else
116
- puts @opt.help
94
+ CFnDK.logger.info 'destroy command was canceled'.color(:green)
117
95
  return 2
118
96
  end
119
- 0
97
+ rescue => e
98
+ CFnDK.logger.error "#{e.class}: #{e.message}".color(:red)
99
+ e.backtrace_locations.each do |line|
100
+ CFnDK.logger.debug line
101
+ end
102
+ return 1
120
103
  end
121
104
 
122
- def destroy?
123
- return true if @option[:force]
124
- loop do
125
- print 'destroy? [yes|no]:'
126
- res = STDIN.gets
127
- case res
128
- when /^yes/
129
- return true
130
- when /^no/, /^$/
131
- return false
132
- end
105
+ desc 'report', 'Report stack'
106
+ option :config_path, type: :string, aliases: 'c', default: "#{Dir.getwd}/cfndk.yml", desc: 'The configuration file to use'
107
+ option :uuid, type: :string, aliases: 'u', default: ENV['CFNDK_UUID'] || nil, desc: 'Use UUID'
108
+ option :stack_names, type: :array, aliases: 's', desc: 'Target stack names'
109
+ option :types, type: :array, default: %w(tag output parameter resource event), desc: 'Report type'
110
+ def report
111
+ CFnDK.logger.info 'report...'.color(:green)
112
+
113
+ data = load_config_data(options)
114
+ credentials = resolve_credential(data, options)
115
+
116
+ stacks = CFnDK::Stacks.new(data, options, credentials)
117
+ stacks.report
118
+ return 0
119
+ rescue => e
120
+ CFnDK.logger.error "#{e.class}: #{e.message}".color(:red)
121
+ e.backtrace_locations.each do |line|
122
+ CFnDK.logger.debug line
133
123
  end
124
+ return 1
134
125
  end
126
+
127
+ no_commands do
128
+ def invoke_command(command, *args)
129
+ CFnDK.logger = CFnDKLogger.new(options)
130
+ Rainbow.enabled = false unless options[:color]
131
+ super
132
+ end
133
+ end
134
+
135
+ desc 'keypair SUBCOMMAND ...ARGS', 'Manage keypair'
136
+ subcommand 'keypair', KeyPairCommand
137
+ desc 'stack SUBCOMMAND ...ARGS', 'Manage stack'
138
+ subcommand 'stack', StackCommand
139
+ desc 'changeset SUBCOMMAND ...ARGS', 'Manage change set'
140
+ subcommand 'changeset', ChangeSetCommand
135
141
  end
136
142
  end