cfndk 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b3c4548d36709c0c878369059819c9c458907a90
4
- data.tar.gz: 2174f779691dfcf915aa1c6385c77b86556ca8eb
3
+ metadata.gz: f083e8a85ab15d77d5de878cfdbe04449b5e4c63
4
+ data.tar.gz: 5baddc25f36a208cc9040fcf40f0d9fc314da6ae
5
5
  SHA512:
6
- metadata.gz: 2922c25d64ec5264c56aad0488945bf24513e3d8cdae007c936494cf6fd96283a514b16a3c9bb91a3cc0cf82c8f0a614c4c6cf3adbed1c21f9701b5f95ae571f
7
- data.tar.gz: e141aa53962fc3c3fd80f4f532583b90acef8f09429a841186973efb82c2947adbd06ac12c5f4d9fc7d4655a523d2d3d3f54cd0255cb095865cc654629cc3ae4
6
+ metadata.gz: 25585042c39f20242014e99ea37bff5e9638621aca5d730d8328c2a09d287a9f70b5dd77795a62e3a1cf80301ca75ff964c3a9c6712e07a6fe829f1f54031e43
7
+ data.tar.gz: 46872932ad3ca28c12ec6238514f0eb068529a682338796fad391b9b6000c2e9d5278b1eb764e2b85f9fd1b73005c29d701ce9c8a296ba266c769a4bd5fc6f6b
data/README.md CHANGED
@@ -163,7 +163,7 @@ UUIDが指定されるとスタック名に付加されます。
163
163
 
164
164
  #### ```-s, --stack-names name1,name2```
165
165
 
166
- create,update,destroy,create_or_changesetのコマンドで、指定されたスタック名のみを操作します。
166
+ 指定されたスタック名のみを操作します。
167
167
 
168
168
  #### ```--no-color```
169
169
 
data/bin/cfndk CHANGED
@@ -12,6 +12,7 @@ require 'json'
12
12
  require 'aws-sdk'
13
13
  require 'terminal-table'
14
14
  require 'securerandom'
15
+ require 'logger'
15
16
 
16
17
  require 'cfndk.rb'
17
18
 
@@ -82,6 +83,8 @@ opt = OptionParser.new do |o|
82
83
  o.permute!(ARGV)
83
84
  end
84
85
 
86
+ logger = CFnDK::Logger.new(option)
87
+
85
88
  if ARGV.length != 1
86
89
  puts opt.help
87
90
  exit 1
@@ -90,17 +93,17 @@ elsif ARGV[0] == 'generate-uuid'
90
93
  exit 0
91
94
  elsif ARGV[0] == 'init'
92
95
  if File.file?(option[:config_path])
93
- puts "File exist. #{option[:config_path]}".color :red
96
+ logger.error "File exist. #{option[:config_path]}".color(:red)
94
97
  exit 1
95
98
  end
96
- puts 'init...'.color :green
99
+ logger.info 'init...'.color(:green)
97
100
  FileUtils.cp_r(Dir.glob(File.dirname(__FILE__) + '/../skel/*'), './')
98
- puts "create #{option[:config_path]}".color :green
101
+ logger.info "create #{option[:config_path]}".color(:green)
99
102
  exit 0
100
103
  end
101
104
 
102
105
  unless File.file?(option[:config_path])
103
- puts "File does not exist. #{option[:config_path]}".color :red
106
+ logger.error "File does not exist. #{option[:config_path]}".color(:red)
104
107
  exit 1
105
108
  end
106
109
 
@@ -110,35 +113,35 @@ stacks = CFnDK::Stacks.new(data, option, credentials)
110
113
  keypairs = CFnDK::KeyPairs.new(data, option, credentials)
111
114
 
112
115
  if ARGV[0] == 'create'
113
- puts 'create...'.color :green
116
+ logger.info 'create...'.color(:green)
114
117
  stacks.validate
115
118
  keypairs.create
116
119
  stacks.create
117
120
  elsif ARGV[0] == 'update'
118
- puts 'update...'.color :green
121
+ logger.info 'update...'.color(:green)
119
122
  stacks.validate
120
123
  stacks.update
121
124
  elsif ARGV[0] == 'create-or-changeset'
122
- puts 'create or changeset...'.color :green
125
+ logger.info 'create or changeset...'.color(:green)
123
126
  stacks.validate
124
127
  stacks.create_or_changeset
125
128
  elsif ARGV[0] == 'destroy'
126
- puts 'destroy...'.color :green
129
+ logger.info 'destroy...'.color(:green)
127
130
  if do_destroy(option)
128
131
  stacks.destroy
129
132
  keypairs.destroy
130
133
  end
131
134
  elsif ARGV[0] == 'validate'
132
- puts 'validate...'.color :green
135
+ logger.info 'validate...'.color(:green)
133
136
  stacks.validate
134
137
  elsif ARGV[0] == 'report-event'
135
- puts 'report event...'.color :green
138
+ logger.info 'report event...'.color(:green)
136
139
  stacks.report_event
137
140
  elsif ARGV[0] == 'report-stack'
138
- puts 'report stack...'.color :green
141
+ logger.info 'report stack...'.color(:green)
139
142
  stacks.report_stack
140
143
  elsif ARGV[0] == 'report-stack-resource'
141
- puts 'report stack resource...'.color :green
144
+ logger.info 'report stack resource...'.color(:green)
142
145
  stacks.report_stack_resource
143
146
  else
144
147
  puts opt.help
data/lib/cfndk.rb CHANGED
@@ -4,6 +4,7 @@ require 'cfndk/stacks'
4
4
  require 'cfndk/key_pair'
5
5
  require 'cfndk/key_pairs'
6
6
  require 'cfndk/erb_string'
7
+ require 'cfndk/logger'
7
8
  require 'cfndk/credential_provider_chain'
8
9
 
9
10
  module CFnDK
@@ -6,25 +6,26 @@ module CFnDK
6
6
  @key_file = nil
7
7
  @key_file = data['key_file'] || nil if data
8
8
  @option = option
9
+ @logger = CFnDK::Logger.new(option)
9
10
  @client = Aws::EC2::Client.new(credentials: credentials)
10
11
  end
11
12
 
12
13
  def create
13
- puts(('creating keypair: ' + name).color(:green))
14
+ @logger.info(('creating keypair: ' + name).color(:green))
14
15
  key_pair = @client.create_key_pair(
15
16
  key_name: name
16
17
  )
17
- puts(('created keypair: ' + name).color(:green))
18
+ @logger.info(('created keypair: ' + name).color(:green))
18
19
 
19
20
  create_key_file(key_pair)
20
21
  end
21
22
 
22
23
  def destroy
23
- puts(('deleting keypair: ' + name).color(:green))
24
+ @logger.info(('deleting keypair: ' + name).color(:green))
24
25
  @client.delete_key_pair(
25
26
  key_name: name
26
27
  )
27
- puts(('deleted keypair: ' + name).color(:green))
28
+ @logger.info(('deleted keypair: ' + name).color(:green))
28
29
  end
29
30
 
30
31
  def name
@@ -33,12 +34,11 @@ module CFnDK
33
34
 
34
35
  private
35
36
 
36
- def create_key_file key_pair
37
+ def create_key_file(key_pair)
37
38
  return unless @key_file
38
39
  key_file = CFnDK::ErbString.new(@key_file, @option).value
39
- puts(('create key file: ' + key_file).color(:green))
40
+ @logger.info(('create key file: ' + key_file).color(:green))
40
41
  File.write(key_file, key_pair.key_material)
41
42
  end
42
-
43
43
  end
44
44
  end
@@ -0,0 +1,14 @@
1
+ module CFnDK
2
+ class Logger < Logger
3
+ def initialize(option)
4
+ super(STDOUT)
5
+ self.level = Logger::INFO unless option[:v]
6
+ self.formatter = proc { |severity, datetime, progname, message|
7
+ message.to_s.split(/\n/).map do |line|
8
+ "#{datetime} #{severity} #{line}\n"
9
+ end.join
10
+ }
11
+ self.datetime_format = '%Y-%m-%dT%H:%M:%S'
12
+ end
13
+ end
14
+ end
data/lib/cfndk/stack.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module CFnDK
2
2
  class Stack
3
3
  attr_reader :template_file, :parameter_input, :capabilities, :depends, :timeout_in_minutes
4
- def initialize(name, data, option)
4
+ def initialize(name, data, option, credentials)
5
5
  @name = name
6
6
  @template_file = data['template_file'] || ''
7
7
  @parameter_input = data['parameter_input'] || ''
@@ -10,6 +10,217 @@ module CFnDK
10
10
  @timeout_in_minutes = data['timeout_in_minutes'] || 1
11
11
  @override_parameters = data['parameters'] || {}
12
12
  @option = option
13
+ @client = Aws::CloudFormation::Client.new(credentials: credentials)
14
+ @logger = CFnDK::Logger.new(option)
15
+ end
16
+
17
+ def create
18
+ return if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(@name)
19
+ @logger.info(('creating stack: ' + @name).color(:green))
20
+ @logger.debug('Name :' + name)
21
+ @logger.debug('Parametres :' + parameters.inspect)
22
+ @logger.debug('Capabilities:' + capabilities.inspect)
23
+ @logger.debug('Timeout :' + timeout_in_minutes.to_s)
24
+ @client.create_stack(
25
+ stack_name: name,
26
+ template_body: template_body,
27
+ parameters: parameters,
28
+ capabilities: capabilities,
29
+ timeout_in_minutes: timeout_in_minutes
30
+ )
31
+ end
32
+
33
+ def wait_until_create
34
+ return if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(@name)
35
+ begin
36
+ @client.wait_until(
37
+ :stack_create_complete,
38
+ stack_name: name
39
+ )
40
+ @logger.info(('created stack: ' + @name).color(:green))
41
+ rescue Aws::Waiters::Errors::FailureStateError => ex
42
+ @logger.error ex.message
43
+ report_event
44
+ raise ex
45
+ end
46
+ end
47
+
48
+ def update
49
+ return false if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(@name)
50
+ @logger.info(('updating stack: ' + @name).color(:green))
51
+ @logger.debug('Name :' + name)
52
+ @logger.debug('Parametres :' + parameters.inspect)
53
+ @logger.debug('Capabilities:' + capabilities.inspect)
54
+ @logger.debug('Timeout :' + timeout_in_minutes.to_s)
55
+ begin
56
+ @client.update_stack(
57
+ stack_name: name,
58
+ template_body: template_body,
59
+ parameters: parameters,
60
+ capabilities: capabilities
61
+ )
62
+ true
63
+ rescue Aws::CloudFormation::Errors::ValidationError => ex
64
+ @logger.error ex.message.color(:red)
65
+ false
66
+ end
67
+ end
68
+
69
+ def wait_until_update
70
+ return if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(@name)
71
+ @client.wait_until(
72
+ :stack_update_complete,
73
+ stack_name: name
74
+ )
75
+ @logger.info(('updated stack: ' + @name).color(:green))
76
+ end
77
+
78
+ def destroy
79
+ return if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(@name)
80
+ @logger.info(('deleting stack: ' + @name).color(:green))
81
+ @logger.debug('Name :' + name)
82
+ @client.delete_stack(
83
+ stack_name: name
84
+ )
85
+ end
86
+
87
+ def wait_until_destroy
88
+ return if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(@name)
89
+ @client.wait_until(
90
+ :stack_delete_complete,
91
+ stack_name: name
92
+ )
93
+ @logger.info(('deleted stack: ' + @name).color(:green))
94
+ end
95
+
96
+ def create_change_set
97
+ return if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(@name)
98
+ @logger.info(('creating change set: ' + @name).color(:green))
99
+ @logger.debug('Name :' + name)
100
+ @logger.debug('Parametres :' + parameters.inspect)
101
+ @logger.debug('Capabilities:' + capabilities.inspect)
102
+ @client.create_change_set(
103
+ stack_name: name,
104
+ template_body: template_body,
105
+ parameters: parameters,
106
+ capabilities: capabilities,
107
+ change_set_name: name
108
+ )
109
+ end
110
+
111
+ def wait_until_create_change_set
112
+ return if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(@name)
113
+ begin
114
+ @client.wait_until(
115
+ :change_set_create_complete,
116
+ stack_name: name,
117
+ change_set_name: name
118
+ )
119
+ @logger.info(('created chnage set: ' + name).color(:green))
120
+ rescue Aws::Waiters::Errors::FailureStateError => ex
121
+ resp = @client.describe_change_set(
122
+ change_set_name: name,
123
+ stack_name: name
124
+ )
125
+ if resp.status_reason != "The submitted information didn't contain changes. Submit different information to create a change set."
126
+ @logger.error ex.message.color(:red)
127
+ raise ex
128
+ else
129
+ @logger.error(('failed create change set: ' + name).color(:red))
130
+ @logger.error resp.status_reason
131
+ @client.delete_change_set(
132
+ change_set_name: name,
133
+ stack_name: name
134
+ )
135
+ @logger.info(('deleted change set: ' + name).color(:red))
136
+ end
137
+ end
138
+ end
139
+
140
+ def validate
141
+ return if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(@name)
142
+ @logger.info(('validate stack: ' + @name).color(:green))
143
+ @logger.debug('Name :' + name)
144
+ @client.validate_template(
145
+ template_body: template_body
146
+ )
147
+ end
148
+
149
+ def exits?
150
+ @client.describe_stacks(
151
+ stack_name: name
152
+ )
153
+ true
154
+ rescue Aws::CloudFormation::Errors::ValidationError
155
+ false
156
+ end
157
+
158
+ def report_stack
159
+ return if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(@name)
160
+ @logger.info(('stack: ' + @name).color(:green))
161
+ @logger.debug('Name :' + name)
162
+ begin
163
+ rows = @client.describe_stacks(
164
+ stack_name: name
165
+ ).stacks.map do |item|
166
+ [
167
+ item.stack_name,
168
+ item.creation_time,
169
+ item.deletion_time,
170
+ coloerd_status(item.stack_status),
171
+ item.stack_status_reason]
172
+ end
173
+ table = Terminal::Table.new headings: %w(Name Creation Deletion Status Reason), rows: rows
174
+ @logger.info table
175
+ rescue Aws::CloudFormation::Errors::ValidationError => ex
176
+ @logger.warn ex.message
177
+ end
178
+ end
179
+
180
+ def report_event
181
+ return if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(@name)
182
+ @logger.info(('stack: ' + @name).color(:green))
183
+ @logger.debug('Name :' + name)
184
+ begin
185
+ rows = @client.describe_stack_events(
186
+ stack_name: name
187
+ ).stack_events.map do |item|
188
+ [
189
+ item.resource_type,
190
+ item.timestamp,
191
+ coloerd_status(item.resource_status),
192
+ item.resource_status_reason]
193
+ end
194
+ table = Terminal::Table.new headings: %w(Type Time Status Reason), rows: rows
195
+ @logger.info table
196
+ rescue Aws::CloudFormation::Errors::ValidationError => ex
197
+ @logger.warn ex.message
198
+ end
199
+ end
200
+
201
+ def report_stack_resource
202
+ return if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(@name)
203
+ @logger.info(('stack: ' + @name).color(:green))
204
+ @logger.debug('Name :' + name)
205
+ begin
206
+ rows = @client.describe_stack_resources(
207
+ stack_name: name
208
+ ).stack_resources.map do |item|
209
+ [
210
+ item.logical_resource_id,
211
+ item.physical_resource_id,
212
+ item.resource_type,
213
+ item.timestamp,
214
+ coloerd_status(item.resource_status),
215
+ item.resource_status_reason,
216
+ item.description,
217
+ ]
218
+ end
219
+ table = Terminal::Table.new headings: %w(L-name P-name Type Timestamp Status Reason Desc), rows: rows
220
+ @logger.info table
221
+ rescue Aws::CloudFormation::Errors::ValidationError => ex
222
+ @logger.warn ex.message
223
+ end
13
224
  end
14
225
 
15
226
  def name
@@ -33,6 +244,23 @@ module CFnDK
33
244
 
34
245
  private
35
246
 
247
+ def coloerd_status(str)
248
+ case str
249
+ when 'CREATE_FAILED' then
250
+ item.resource_status.color :red
251
+ when 'ROLLBACK_IN_PROGRESS' then
252
+ item.resource_status.color :red
253
+ when 'ROLLBACK_COMPLETE' then
254
+ item.resource_status.color :red
255
+ when 'CREATE_COMPLETE' then
256
+ item.resource_status.color :green
257
+ when 'DELETE_COMPLETE' then
258
+ item.resource_status.color :gray
259
+ else
260
+ item.resource_status.color :orange
261
+ end
262
+ end
263
+
36
264
  def eval_override_parameter(k, v)
37
265
  if @override_parameters[k]
38
266
  CFnDK::ErbString.new(@override_parameters[k], @option).value
data/lib/cfndk/stacks.rb CHANGED
@@ -2,41 +2,20 @@ module CFnDK
2
2
  class Stacks
3
3
  def initialize(data, option, credentials)
4
4
  @option = option
5
- @cfn_client = Aws::CloudFormation::Client.new(credentials: credentials)
6
- create_stack data
7
- create_sequence
5
+ @credentials = credentials
6
+ @logger = CFnDK::Logger.new(option)
7
+
8
+ prepare_stack(data)
9
+ prepare_sequence
8
10
  end
9
11
 
10
12
  def create
11
13
  @sequence.each do |stacks|
12
14
  stacks.each do |name|
13
- next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
14
- puts(('creating ' + name).color(:green))
15
- puts('Name :' + @stacks[name].name) if @option[:v]
16
- puts('Parametres :' + @stacks[name].parameters.inspect) if @option[:v]
17
- puts('Capabilities:' + @stacks[name].capabilities.inspect) if @option[:v]
18
- puts('timeout :' + @stacks[name].timeout_in_minutes.to_s) if @option[:v]
19
- @cfn_client.create_stack(
20
- stack_name: @stacks[name].name,
21
- template_body: @stacks[name].template_body,
22
- parameters: @stacks[name].parameters,
23
- capabilities: @stacks[name].capabilities,
24
- timeout_in_minutes: @stacks[name].timeout_in_minutes
25
- )
15
+ @stacks[name].create
26
16
  end
27
17
  stacks.each do |name|
28
- next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
29
- begin
30
- @cfn_client.wait_until(
31
- :stack_create_complete,
32
- stack_name: @stacks[name].name
33
- )
34
- puts(('created ' + name).color(:green))
35
- rescue Aws::Waiters::Errors::FailureStateError => ex
36
- puts ex.message
37
- report_event
38
- raise ex
39
- end
18
+ @stacks[name].wait_until_create
40
19
  end
41
20
  end
42
21
  end
@@ -45,31 +24,30 @@ module CFnDK
45
24
  @sequence.each do |stacks|
46
25
  updating_stacks = []
47
26
  stacks.each do |name|
48
- next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
49
- puts(('updating ' + name).color(:green))
50
- puts('Name :' + @stacks[name].name) if @option[:v]
51
- puts('Parametres :' + @stacks[name].parameters.inspect) if @option[:v]
52
- puts('Capabilities:' + @stacks[name].capabilities.inspect) if @option[:v]
53
- puts('timeout :' + @stacks[name].timeout_in_minutes.to_s) if @option[:v]
54
- begin
55
- @cfn_client.update_stack(
56
- stack_name: @stacks[name].name,
57
- template_body: @stacks[name].template_body,
58
- parameters: @stacks[name].parameters,
59
- capabilities: @stacks[name].capabilities
60
- )
61
- updating_stacks.push name
62
- rescue Aws::CloudFormation::Errors::ValidationError => ex
63
- puts ex.message.color :red
64
- end
27
+ result = @stacks[name].update
28
+ updating_stacks.push name if result
65
29
  end
66
30
  updating_stacks.each do |name|
67
- next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
68
- @cfn_client.wait_until(
69
- :stack_update_complete,
70
- stack_name: @stacks[name].name
71
- )
72
- puts(('updated ' + name).color(:green))
31
+ @stacks[name].wait_until_update
32
+ end
33
+ end
34
+ end
35
+
36
+ def destroy
37
+ @sequence.reverse_each do |stacks|
38
+ stacks.each do |name|
39
+ @stacks[name].destroy
40
+ end
41
+ stacks.each do |name|
42
+ @stacks[name].wait_until_destroy
43
+ end
44
+ end
45
+ end
46
+
47
+ def validate
48
+ @sequence.each do |stacks|
49
+ stacks.each do |name|
50
+ @stacks[name].validate
73
51
  end
74
52
  end
75
53
  end
@@ -79,238 +57,57 @@ module CFnDK
79
57
  create_stacks = []
80
58
  changeset_stacks = []
81
59
  stacks.each do |name|
82
- next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
83
- begin
84
- @cfn_client.describe_stacks(
85
- stack_name: @stacks[name].name
86
- )
87
- puts(('creating ' + name).color(:green))
88
- puts('Name :' + @stacks[name].name) if @option[:v]
89
- puts('Parametres :' + @stacks[name].parameters.inspect) if @option[:v]
90
- puts('Capabilities:' + @stacks[name].capabilities.inspect) if @option[:v]
91
- @cfn_client.create_change_set(
92
- stack_name: @stacks[name].name,
93
- template_body: @stacks[name].template_body,
94
- parameters: @stacks[name].parameters,
95
- capabilities: @stacks[name].capabilities,
96
- change_set_name: @stacks[name].name,
97
- )
60
+ if @stacks[name].exits?
61
+ @stacks[name].create_change_set
98
62
  changeset_stacks.push name
99
- rescue Aws::CloudFormation::Errors::ValidationError
100
- puts(('creating ' + name).color(:green))
101
- puts('Name :' + @stacks[name].name) if @option[:v]
102
- puts('Parametres :' + @stacks[name].parameters.inspect) if @option[:v]
103
- puts('Capabilities:' + @stacks[name].capabilities.inspect) if @option[:v]
104
- puts('timeout :' + @stacks[name].timeout_in_minutes.to_s) if @option[:v]
105
- @cfn_client.create_stack(
106
- stack_name: @stacks[name].name,
107
- template_body: @stacks[name].template_body,
108
- parameters: @stacks[name].parameters,
109
- capabilities: @stacks[name].capabilities,
110
- timeout_in_minutes: @stacks[name].timeout_in_minutes
111
- )
63
+ else
64
+ @stacks[name].create
112
65
  create_stacks.push name
113
66
  end
114
67
  end
115
68
  create_stacks.each do |name|
116
- next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
117
- @cfn_client.wait_until(
118
- :stack_create_complete,
119
- stack_name: @stacks[name].name
120
- )
121
- puts(('created ' + name).color(:green))
69
+ @stacks[name].wait_until_create
122
70
  end
123
71
  changeset_stacks.each do |name|
124
- next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
125
- begin
126
- @cfn_client.wait_until(
127
- :change_set_create_complete,
128
- stack_name: @stacks[name].name,
129
- change_set_name: @stacks[name].name
130
- )
131
- puts(('created ' + @stacks[name].name).color(:green))
132
- rescue Aws::Waiters::Errors::FailureStateError => ex
133
- resp = @cfn_client.describe_change_set(
134
- change_set_name: @stacks[name].name,
135
- stack_name: @stacks[name].name,
136
- )
137
- if resp.status_reason != "The submitted information didn't contain changes. Submit different information to create a change set."
138
- puts ex.message.color :red
139
- raise ex
140
- else
141
- puts(('failed ' + @stacks[name].name).color(:red))
142
- puts resp.status_reason
143
- @cfn_client.delete_change_set(
144
- change_set_name: @stacks[name].name,
145
- stack_name: @stacks[name].name,
146
- )
147
- puts(('deleted ' + @stacks[name].name).color(:red))
148
- end
149
- end
72
+ @stacks[name].wait_until_create_change_set
150
73
  end
151
74
  end
152
75
  end
153
76
 
154
77
  def report_stack
155
- rows = @sequence.flat_map do |stacks|
156
- stacks.flat_map do |name|
157
- rows = []
158
- begin
159
- rows = @cfn_client.describe_stacks(
160
- stack_name: @stacks[name].name
161
- ).stacks.map do |item|
162
- [
163
- item.stack_name,
164
- item.creation_time,
165
- item.deletion_time,
166
- case item.stack_status
167
- when 'CREATE_FAILED' then
168
- item.stack_status.color :red
169
- when 'ROLLBACK_IN_PROGRESS' then
170
- item.stack_status.color :red
171
- when 'ROLLBACK_COMPLETE' then
172
- item.stack_status.color :red
173
- when 'CREATE_COMPLETE' then
174
- item.stack_status.color :green
175
- when 'DELETE_COMPLETE' then
176
- item.stack_status.color :gray
177
- else
178
- item.stack_status.color :orange
179
- end,
180
- item.stack_status_reason]
181
- end
182
- rescue Aws::CloudFormation::Errors::ValidationError => ex
183
- puts ex.message
184
- end
185
- rows
186
- end
187
- end
188
- table = Terminal::Table.new headings: %w(Name Creation Deletion Status Reason), rows: rows
189
- puts table
190
- end
191
-
192
- def report_stack_resource
193
78
  @sequence.each do |stacks|
194
79
  stacks.each do |name|
195
- puts(('stack ' + name).color(:green))
196
- puts('Name :' + @stacks[name].name) if @option[:v]
197
- begin
198
- rows = @cfn_client.describe_stack_resources(
199
- stack_name: @stacks[name].name
200
- ).stack_resources.map do |item|
201
- [
202
- item.logical_resource_id,
203
- item.physical_resource_id,
204
- item.resource_type,
205
- item.timestamp,
206
- case item.resource_status
207
- when 'CREATE_FAILED' then
208
- item.resource_status.color :red
209
- when 'ROLLBACK_IN_PROGRESS' then
210
- item.resource_status.color :red
211
- when 'ROLLBACK_COMPLETE' then
212
- item.resource_status.color :red
213
- when 'CREATE_COMPLETE' then
214
- item.resource_status.color :green
215
- when 'DELETE_COMPLETE' then
216
- item.resource_status.color :gray
217
- else
218
- item.resource_status.color :orange
219
- end,
220
- item.resource_status_reason,
221
- item.description,
222
- ]
223
- end
224
- table = Terminal::Table.new headings: %w(L-name P-name Type Timestamp Status Reason Desc), rows: rows
225
- puts table
226
- rescue Aws::CloudFormation::Errors::ValidationError => ex
227
- puts ex.message
228
- end
80
+ @stacks[name].report_stack
229
81
  end
230
82
  end
231
83
  end
232
84
 
233
- def report_event
85
+ def report_stack_resource
234
86
  @sequence.each do |stacks|
235
87
  stacks.each do |name|
236
- puts(('stack ' + name).color(:green))
237
- puts('Name :' + @stacks[name].name) if @option[:v]
238
- begin
239
- rows = @cfn_client.describe_stack_events(
240
- stack_name: @stacks[name].name
241
- ).stack_events.map do |item|
242
- [
243
- item.resource_type,
244
- item.timestamp,
245
- case item.resource_status
246
- when 'CREATE_FAILED' then
247
- item.resource_status.color :red
248
- when 'ROLLBACK_IN_PROGRESS' then
249
- item.resource_status.color :red
250
- when 'ROLLBACK_COMPLETE' then
251
- item.resource_status.color :red
252
- when 'CREATE_COMPLETE' then
253
- item.resource_status.color :green
254
- when 'DELETE_COMPLETE' then
255
- item.resource_status.color :gray
256
- else
257
- item.resource_status.color :orange
258
- end,
259
- item.resource_status_reason]
260
- end
261
- table = Terminal::Table.new headings: %w(Type Time Status Reason), rows: rows
262
- puts table
263
- rescue Aws::CloudFormation::Errors::ValidationError => ex
264
- puts ex.message
265
- end
266
- end
267
- end
268
- end
269
-
270
- def destroy
271
- @sequence.reverse_each do |stacks|
272
- stacks.each do |name|
273
- next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
274
- puts(('deleting ' + name).color(:green))
275
- puts('Name :' + @stacks[name].name) if @option[:v]
276
- @cfn_client.delete_stack(
277
- stack_name: @stacks[name].name
278
- )
279
- end
280
- stacks.each do |name|
281
- next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
282
- @cfn_client.wait_until(
283
- :stack_delete_complete,
284
- stack_name: @stacks[name].name
285
- )
286
- puts(('deleted ' + name).color(:green))
88
+ @stacks[name].report_stack_resource
287
89
  end
288
90
  end
289
91
  end
290
92
 
291
- def validate
93
+ def report_event
292
94
  @sequence.each do |stacks|
293
95
  stacks.each do |name|
294
- next if @option[:stack_names].instance_of?(Array) && !@option[:stack_names].include?(name)
295
- puts(('validate ' + name).color(:green))
296
- puts('Name :' + @stacks[name].name) if @option[:v]
297
- @cfn_client.validate_template(
298
- template_body: @stacks[name].template_body
299
- )
96
+ @stacks[name].report_event
300
97
  end
301
98
  end
302
99
  end
303
100
 
304
101
  private
305
102
 
306
- def create_stack(data)
103
+ def prepare_stack(data)
307
104
  @stacks = {}
308
105
  data['stacks'].each do |name, properties|
309
- @stacks[name] = Stack.new(name, properties, @option)
106
+ @stacks[name] = Stack.new(name, properties, @option, @credentials)
310
107
  end
311
108
  end
312
109
 
313
- def create_sequence
110
+ def prepare_sequence
314
111
  @sequence = []
315
112
  names_of_upprocessed_stack = @stacks.keys
316
113
  names_of_processed_stack = []
@@ -320,7 +117,7 @@ module CFnDK
320
117
  names_of_processed_stack.include? depend_name
321
118
  end
322
119
  end
323
- raise 'There are cyclic dependency.' if names.empty?
120
+ raise 'There are cyclic dependency or stack is not exit. unprocessed_stack: ' + names_of_upprocessed_stack.join(',') if names.empty?
324
121
  names_of_processed_stack += names
325
122
  names_of_upprocessed_stack -= names
326
123
  @sequence.push names
data/lib/cfndk/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module CFnDK
2
- VERSION = '0.0.4'.freeze
2
+ VERSION = '0.0.5'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cfndk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yoshihisa AMAKATA
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-17 00:00:00.000000000 Z
11
+ date: 2019-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -115,6 +115,7 @@ files:
115
115
  - lib/cfndk/erb_string.rb
116
116
  - lib/cfndk/key_pair.rb
117
117
  - lib/cfndk/key_pairs.rb
118
+ - lib/cfndk/logger.rb
118
119
  - lib/cfndk/stack.rb
119
120
  - lib/cfndk/stacks.rb
120
121
  - lib/cfndk/version.rb