kumogata 0.4.3 → 0.4.4

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: 5a3f0cb776ca09cc7162b3c08e21582de86aa421
4
- data.tar.gz: d4e87584f981bba7523eaac028554032ecdfd8fb
3
+ metadata.gz: df82f77f6c7023cbdaa9cf336a3857bd76bdbecb
4
+ data.tar.gz: 0f6e167f920c80123bcf89338dbb023439eb46c8
5
5
  SHA512:
6
- metadata.gz: 1488d23314c6723a1a6da704567a0321a735f15c56df3bb32ff531c439d6ed56c7b7e1b7e8d866aa0cae2b86fbf4bc18eb4c359d06df8bf74314f8fae15c49ac
7
- data.tar.gz: 05f53a9aa0e64b040e510598ee38b484ba6febf493ab1f8f61995676e8d2a232ed9e1fa7918b6fefb603a8e899c8828615749ead921e8178ea4f4d94b2c3518a
6
+ metadata.gz: a53b163c4963b3a216e4c7e2d563f63d75f76073f4f18b0386e75120e417f0717bcc5cfbaefe007d402e16c0c92de04cbe8669c1cff80d450fe5682f68442f1e
7
+ data.tar.gz: ec3887e27bcecedb0ce01bf7e79a7e0077a0d6e61ee6269c88e51e9de72d9a3fbcb87f79f374c95f0c50547569ffcea2336d0ea2405043908c09e619434b8236
data/README.md CHANGED
@@ -5,8 +5,8 @@
5
5
 
6
6
  Kumogata is a tool for [AWS CloudFormation](https://aws.amazon.com/cloudformation/).
7
7
 
8
- [![Gem Version](https://badge.fury.io/rb/kumogata.png?201403130002)](http://badge.fury.io/rb/kumogata)
9
- [![Build Status](https://drone.io/github.com/winebarrel/kumogata/status.png?201403130002)](https://drone.io/github.com/winebarrel/kumogata/latest)
8
+ [![Gem Version](https://badge.fury.io/rb/kumogata.png?201403130235)](http://badge.fury.io/rb/kumogata)
9
+ [![Build Status](https://drone.io/github.com/winebarrel/kumogata/status.png?201403130235)](https://drone.io/github.com/winebarrel/kumogata/latest)
10
10
 
11
11
  It can define a template in Ruby DSL, such as:
12
12
 
data/kumogata.gemspec CHANGED
@@ -32,4 +32,5 @@ Gem::Specification.new do |spec|
32
32
  spec.add_development_dependency 'bundler'
33
33
  spec.add_development_dependency 'rake'
34
34
  spec.add_development_dependency 'rspec', '>= 2.11.0'
35
+ spec.add_development_dependency 'timecop'
35
36
  end
@@ -39,7 +39,10 @@ class Kumogata::Client
39
39
 
40
40
  def update(path_or_url, stack_name)
41
41
  validate_stack_name(stack_name)
42
+
43
+ @options.delete_stack = false
42
44
  template = open_template(path_or_url)
45
+ update_deletion_policy(template, :update_metadate => true)
43
46
  add_encryption_password(template)
44
47
 
45
48
  outputs = update_stack(template, stack_name)
@@ -444,11 +447,16 @@ class Kumogata::Client
444
447
  end
445
448
  end
446
449
 
447
- def update_deletion_policy(template)
450
+ def update_deletion_policy(template, options = {})
448
451
  if @options.delete_stack? or @options.deletion_policy_retain?
449
452
  template['Resources'].each do |k, v|
450
453
  next if /\AAWS::CloudFormation::/ =~ v['Type']
451
454
  v['DeletionPolicy'] ||= 'Retain'
455
+
456
+ if options[:update_metadate]
457
+ v['Metadata'] ||= {}
458
+ v['Metadata']['DeletionPolicyUpdateKeyForKumogata'] = "DeletionPolicyUpdateValueForKumogata#{Time.now.to_i}"
459
+ end
452
460
  end
453
461
  end
454
462
  end
@@ -25,7 +25,7 @@ class Kumogata::PostProcessing
25
25
  raise "Invalid post processing: #{name} => #{attrs.inspect}"
26
26
  end
27
27
 
28
- timing = [(attrs['after'] || TRIGGER_TIMING)].flatten.map {|i| i.to_sym }
28
+ timing = [(attrs['after'] || [:create])].flatten.map {|i| i.to_sym }
29
29
  command = attrs['command']
30
30
 
31
31
  validate_timing(name, timing)
@@ -1,3 +1,3 @@
1
1
  module Kumogata
2
- VERSION = '0.4.3'
2
+ VERSION = '0.4.4'
3
3
  end
@@ -56,6 +56,69 @@ end
56
56
  end
57
57
  end
58
58
 
59
+ it 'update a stack from Ruby template with deletion policy retain' do
60
+ template = <<-EOS
61
+ Resources do
62
+ myEC2Instance do
63
+ Type "AWS::EC2::Instance"
64
+ Properties do
65
+ ImageId "ami-XXXXXXXX"
66
+ InstanceType "t1.micro"
67
+ end
68
+ end
69
+ end
70
+
71
+ Outputs do
72
+ AZ do
73
+ Value do
74
+ Fn__GetAtt "myEC2Instance", "AvailabilityZone"
75
+ end
76
+ end
77
+ end
78
+ EOS
79
+
80
+ Timecop.freeze(Time.parse('2014/03/13 0:00')) do
81
+ run_client(:update, :arguments => ['MyStack'], :template => template, :options => {:deletion_policy_retain => true}) do |client, cf|
82
+ template = eval_template(template, :update_deletion_policy => true)
83
+ template["Resources"]["myEC2Instance"]["Metadata"] = {
84
+ "DeletionPolicyUpdateKeyForKumogata" => "DeletionPolicyUpdateValueForKumogata1394636400"
85
+ }
86
+ json = template.to_json
87
+ client.should_receive(:print_event_log).once
88
+ client.should_receive(:create_event_log).once
89
+
90
+ output = make_double('output') do |obj|
91
+ obj.should_receive(:key) { 'AZ' }
92
+ obj.should_receive(:value) { 'ap-northeast-1b' }
93
+ end
94
+
95
+ resource_summary = make_double('resource_summary') do |obj|
96
+ obj.should_receive(:[]).with(:logical_resource_id) { 'myEC2Instance' }
97
+ obj.should_receive(:[]).with(:physical_resource_id) { 'i-XXXXXXXX' }
98
+ obj.should_receive(:[]).with(:resource_type) { 'AWS::EC2::Instance' }
99
+ obj.should_receive(:[]).with(:resource_status) { 'UPDATE_COMPLETE' }
100
+ obj.should_receive(:[]).with(:resource_status_reason) { nil }
101
+ obj.should_receive(:[]).with(:last_updated_timestamp) { '2014-03-02 04:35:12 UTC' }
102
+ end
103
+
104
+ stack = make_double('stack') do |obj|
105
+ obj.should_receive(:update).with(:template => json)
106
+ obj.should_receive(:status).and_return(
107
+ 'UPDATE_COMPLETE', 'UPDATE_COMPLETE', 'UPDATE_COMPLETE')
108
+ obj.should_receive(:outputs) { [output] }
109
+ obj.should_receive(:resource_summaries) { [resource_summary] }
110
+ end
111
+
112
+ stacks = make_double('stacks') do |obj|
113
+ obj.should_receive(:[])
114
+ .with('MyStack') { stack }
115
+ end
116
+
117
+ cf.should_receive(:stacks) { stacks }
118
+ end
119
+ end
120
+ end
121
+
59
122
  it 'update a stack from Ruby template and run command' do
60
123
  template = <<-TEMPLATE
61
124
  Resources do
@@ -137,35 +200,16 @@ end
137
200
 
138
201
  cf.should_receive(:stacks) { stacks }
139
202
 
203
+ process_status1 = double('process_status1')
204
+ process_status2 = double('process_status2')
140
205
 
141
- process_status1 = make_double('process_status1') {|obj| obj.should_receive(:to_i).and_return(0) }
142
- process_status2 = make_double('process_status2') {|obj| obj.should_receive(:to_i).and_return(0) }
143
-
144
- client.instance_variable_get(:@post_processing)
145
- .should_receive(:run_shell_command)
146
- .with(" echo <%= Key \"AZ\" %>\n echo <%= Key \"Region\" %>\n", {"AZ"=>"ap-northeast-1b", "Region"=>"ap-northeast-1"})
147
- .and_return(["ap-northeast-1b\nap-northeast-1\n", "", process_status1])
148
- client.instance_variable_get(:@post_processing)
149
- .should_receive(:run_shell_command)
150
- .with(" echo <%= Key \"Region\" %>\n echo <%= Key \"AZ\" %>\n", {"AZ"=>"ap-northeast-1b", "Region"=>"ap-northeast-1"})
151
- .and_return(["ap-northeast-1\nap-northeast-1b\n", "", process_status2])
152
-
153
- client.instance_variable_get(:@post_processing)
154
- .should_receive(:print_command).with('command_a')
155
- client.instance_variable_get(:@post_processing)
156
- .should_receive(:print_command).with('command_b')
206
+ Open3.should_not_receive(:capture3)
157
207
 
158
208
  client.instance_variable_get(:@post_processing)
159
- .should_receive(:print_command_result)
160
- .with("ap-northeast-1b\nap-northeast-1\n", "", process_status1)
161
- client.instance_variable_get(:@post_processing)
162
- .should_receive(:print_command_result)
163
- .with("ap-northeast-1\nap-northeast-1b\n", "", process_status2)
209
+ .should_not_receive(:print_command_result)
164
210
 
165
211
  client.instance_variable_get(:@post_processing)
166
- .should_receive(:save_command_results)
167
- .with([{'command_a' => {'ExitStatus' => 0, 'StdOut' => "ap-northeast-1b\nap-northeast-1\n", 'StdErr' => ""}},
168
- {'command_b' => {'ExitStatus' => 0, 'StdOut' => "ap-northeast-1\nap-northeast-1b\n", 'StdErr' => ""}}])
212
+ .should_not_receive(:save_command_results)
169
213
  end
170
214
  end
171
215
 
@@ -191,6 +235,7 @@ end
191
235
 
192
236
  _post do
193
237
  ssh_command do
238
+ after :update
194
239
  ssh do
195
240
  host { Key "PublicIp" }
196
241
  user "ec2-user"
@@ -251,7 +296,6 @@ end
251
296
  client.instance_variable_get(:@post_processing)
252
297
  .should_receive(:save_command_results)
253
298
  .with([{'ssh_command' => {'ExitStatus' => 0, 'StdOut' => "file1\nfile2\n", 'StdErr' => ""}}])
254
-
255
299
  end
256
300
  end
257
301
 
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'kumogata'
2
2
  require 'tempfile'
3
+ require 'time'
4
+ require 'timecop'
3
5
  require 'uuidtools'
4
6
 
5
7
  Kumogata::ENCRYPTION_PASSWORD.replace('EncryptionPassword')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kumogata
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Genki Sugawara
@@ -206,6 +206,20 @@ dependencies:
206
206
  - - '>='
207
207
  - !ruby/object:Gem::Version
208
208
  version: 2.11.0
209
+ - !ruby/object:Gem::Dependency
210
+ name: timecop
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - '>='
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - '>='
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
209
223
  description: A tool for AWS CloudFormation. It can define a template in Ruby DSL.
210
224
  email:
211
225
  - sgwr_dts@yahoo.co.jp