simple_deploy 0.7.3 → 0.7.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,4 +1,6 @@
1
- ## head:
1
+ ## v0.7.4:
2
+
3
+ * Updated the update command so it can now take a new template
2
4
 
3
5
  ## v0.7.3 (05/17/2013):
4
6
 
@@ -18,7 +18,7 @@ module SimpleDeploy
18
18
  'TemplateBody' => args[:template] }.merge parameters
19
19
  @connect.create_stack(args[:name], data)
20
20
  @logger.info "Cloud Formation stack creation completed."
21
- rescue Exception => e
21
+ rescue Exception => e
22
22
  Error.new(:exception => e).process
23
23
  end
24
24
 
@@ -28,32 +28,32 @@ module SimpleDeploy
28
28
  'TemplateBody' => args[:template] }.merge parameters
29
29
  @connect.update_stack(args[:name], data)
30
30
  @logger.info "Cloud Formation stack update completed."
31
- rescue Exception => e
31
+ rescue Exception => e
32
32
  Error.new(:exception => e).process
33
33
  end
34
34
 
35
35
  def destroy(name)
36
36
  @connect.delete_stack name
37
37
  @logger.info "Cloud Formation stack destroy completed."
38
- rescue Exception => e
38
+ rescue Exception => e
39
39
  Error.new(:exception => e).process
40
40
  end
41
41
 
42
42
  def describe_stack(name)
43
43
  @connect.describe_stacks('StackName' => name).body['Stacks']
44
- rescue Exception => e
44
+ rescue Exception => e
45
45
  Error.new(:exception => e).process
46
46
  end
47
47
 
48
48
  def stack_resources(name)
49
49
  @connect.describe_stack_resources('StackName' => name).body['StackResources']
50
- rescue Exception => e
50
+ rescue Exception => e
51
51
  Error.new(:exception => e).process
52
52
  end
53
53
 
54
54
  def stack_events(name, limit)
55
55
  @connect.describe_stack_events(name).body['StackEvents'] [0..limit-1]
56
- rescue Exception => e
56
+ rescue Exception => e
57
57
  Error.new(:exception => e).process
58
58
  end
59
59
 
@@ -67,7 +67,7 @@ module SimpleDeploy
67
67
 
68
68
  def template(name)
69
69
  @connect.get_template(name).body['TemplateBody']
70
- rescue Exception => e
70
+ rescue Exception => e
71
71
  Error.new(:exception => e).process
72
72
  end
73
73
 
@@ -25,6 +25,7 @@ EOS
25
25
  :default => 'info'
26
26
  opt :name, "Stack name(s) of stack to deploy", :type => :string,
27
27
  :multi => true
28
+ opt :template, "Path to a new template file", :type => :string
28
29
  end
29
30
 
30
31
  valid_options? :provided => @opts,
@@ -39,8 +40,14 @@ EOS
39
40
  stack = Stack.new :name => name,
40
41
  :environment => @opts[:environment]
41
42
 
43
+ if @opts[:template]
44
+ template_body = IO.read @opts[:template]
45
+ end
46
+
42
47
  rescue_exceptions_and_exit do
43
- stack.update :force => @opts[:force], :attributes => attributes
48
+ stack.update :force => @opts[:force],
49
+ :template_body => template_body,
50
+ :attributes => attributes
44
51
  end
45
52
  end
46
53
  end
@@ -11,12 +11,12 @@ module SimpleDeploy
11
11
  @template_body = args[:template_body]
12
12
  end
13
13
 
14
- def update_stack_if_parameters_changed(attributes)
15
- if parameter_updated?(attributes)
16
- @logger.debug "Updated parameters found."
14
+ def update_stack(attributes)
15
+ if parameter_updated?(attributes) || @template_body
16
+ @logger.debug 'Updated parameters or new template found.'
17
17
  update
18
18
  else
19
- @logger.debug "No Cloud Formation parameters require updating."
19
+ @logger.debug 'No parameters require updating and no new template found.'
20
20
  false
21
21
  end
22
22
  end
@@ -26,9 +26,9 @@ module SimpleDeploy
26
26
  def update
27
27
  if status.wait_for_stable
28
28
  @logger.info "Updating Cloud Formation stack #{@name}."
29
- cloud_formation.update :name => @name,
29
+ cloud_formation.update :name => @name,
30
30
  :parameters => read_parameters_from_entry_attributes,
31
- :template => @template_body
31
+ :template => @template_body
32
32
  else
33
33
  raise "#{@name} did not reach a stable state."
34
34
  end
@@ -30,7 +30,7 @@ module SimpleDeploy
30
30
 
31
31
  @entry.set_attributes attributes
32
32
  stack_creator.create
33
-
33
+
34
34
  @entry.save
35
35
  end
36
36
 
@@ -47,10 +47,10 @@ module SimpleDeploy
47
47
  if deployment.clear_for_deployment?
48
48
  @logger.info "Updating #{@name}."
49
49
  attributes = stack_attribute_formatter.updated_attributes args[:attributes]
50
- @template_body = template
50
+ @template_body = args[:template_body] || template
51
51
 
52
52
  @entry.set_attributes attributes
53
- stack_updater.update_stack_if_parameters_changed attributes
53
+ stack_updater.update_stack attributes
54
54
  @logger.info "Update complete for #{@name}."
55
55
 
56
56
  @entry.save
@@ -65,10 +65,9 @@ module SimpleDeploy
65
65
  if args[:caller].kind_of? Stack::Deployment::Status
66
66
  @logger.info "Updating #{@name}."
67
67
  attributes = stack_attribute_formatter.updated_attributes args[:attributes]
68
- @template_body = template
69
68
 
70
69
  @entry.set_attributes attributes
71
- stack_updater.update_stack_if_parameters_changed attributes
70
+ stack_updater.update_stack attributes
72
71
  @logger.info "Update complete for #{@name}."
73
72
 
74
73
  @entry.save
@@ -1,3 +1,3 @@
1
1
  module SimpleDeploy
2
- VERSION = "0.7.3"
2
+ VERSION = "0.7.4"
3
3
  end
@@ -170,7 +170,7 @@ describe SimpleDeploy::CLI::Clone do
170
170
 
171
171
  subject.should_receive(:valid_options?).
172
172
  with(:provided => @options,
173
- :required => [:environment, :source_name, :new_name])
173
+ :required => [:environment, :source_name, :new_name])
174
174
  Trollop.stub(:options).and_return(@options)
175
175
 
176
176
  @new_stack_mock.should_receive(:create) do |options|
@@ -10,20 +10,22 @@ describe SimpleDeploy::CLI::Update do
10
10
  describe 'update' do
11
11
  before do
12
12
  @stack_mock1.stub(:attributes).and_return({})
13
+ @template_body = "{ \"fake_json\" : \"goodness\"}"
14
+
15
+ @options = { :environment => 'my_env',
16
+ :log_level => 'debug',
17
+ :name => ['my_stack1'],
18
+ :force => true,
19
+ :attributes => ['chef_repo_bucket_prefix=intu-lc'] }
20
+
13
21
  end
14
22
 
15
23
  it "should pass force true" do
16
- options = { :environment => 'my_env',
17
- :log_level => 'debug',
18
- :name => ['my_stack1'],
19
- :force => true,
20
- :attributes => ['chef_repo_bucket_prefix=intu-lc'] }
21
-
22
24
  subject.should_receive(:valid_options?).
23
- with(:provided => options,
25
+ with(:provided => @options,
24
26
  :required => [:environment, :name])
25
27
 
26
- Trollop.stub(:options).and_return(options)
28
+ Trollop.stub(:options).and_return(@options)
27
29
 
28
30
  @stack_mock1.should_receive(:update).with(hash_including(:force => true))
29
31
 
@@ -31,21 +33,32 @@ describe SimpleDeploy::CLI::Update do
31
33
  end
32
34
 
33
35
  it "should pass force false" do
34
- options = { :environment => 'my_env',
35
- :log_level => 'debug',
36
- :name => ['my_stack1'],
37
- :force => false,
38
- :attributes => ['chef_repo_bucket_prefix=intu-lc'] }
36
+ @options[:force] = false
39
37
 
40
38
  subject.should_receive(:valid_options?).
41
- with(:provided => options,
39
+ with(:provided => @options,
42
40
  :required => [:environment, :name])
43
41
 
44
- Trollop.stub(:options).and_return(options)
42
+ Trollop.stub(:options).and_return(@options)
45
43
 
46
44
  @stack_mock1.should_receive(:update).with(hash_including(:force => false))
47
45
 
48
46
  subject.update
49
47
  end
48
+
49
+ it "should update the template if a new template is provided" do
50
+ @options[:template] = 'brand_new_template.json'
51
+
52
+ subject.should_receive(:valid_options?).
53
+ with(:provided => @options,
54
+ :required => [:environment, :name])
55
+
56
+ Trollop.stub(:options).and_return(@options)
57
+
58
+ IO.should_receive(:read).with('brand_new_template.json').and_return(@template_body)
59
+
60
+ @stack_mock1.should_receive(:update).with(hash_including(:template_body => @template_body))
61
+ subject.update
62
+ end
50
63
  end
51
64
  end
@@ -18,6 +18,23 @@ describe SimpleDeploy::StackUpdater do
18
18
  }
19
19
  }
20
20
  }'
21
+
22
+ @new_template_body = '{ "Parameters":
23
+ {
24
+ "param1" :
25
+ {
26
+ "Description" : "param-1"
27
+ },
28
+ "param2" :
29
+ {
30
+ "Description" : "param-2"
31
+ },
32
+ "param3" :
33
+ {
34
+ "Description" : "param-3"
35
+ }
36
+ }
37
+ }'
21
38
  end
22
39
 
23
40
  it "should update the stack when parameters change and stack is stable" do
@@ -41,39 +58,50 @@ describe SimpleDeploy::StackUpdater do
41
58
  :template_body => @template_body,
42
59
  :entry => entry_mock
43
60
 
44
- stack_updater.update_stack_if_parameters_changed( [ { 'param1' => 'new-value' } ] ).
61
+ stack_updater.update_stack( [ { 'param1' => 'new-value' } ] ).
45
62
  should == true
46
63
  end
47
64
 
48
- it "should raise an error when parameters change and stack is not stable" do
65
+ it "should update the stack when only the template body changes and stack is stable" do
49
66
  attributes = { "param1" => "value1", "param3" => "value3" }
50
67
  entry_mock = mock 'entry mock'
51
68
  status_mock = mock 'status mock'
52
69
  cloud_formation_mock = mock 'cloud formation mock'
53
70
  SimpleDeploy::AWS::CloudFormation.should_receive(:new).
54
- exactly(0).times
71
+ and_return cloud_formation_mock
72
+ entry_mock.stub(:attributes).and_return attributes
73
+
74
+ cloud_formation_mock.should_receive(:update).
75
+ with(:name => 'test-stack',
76
+ :parameters => { 'param1' => 'value1', 'param3' => 'value3' },
77
+ :template => @new_template_body).
78
+ and_return true
55
79
  SimpleDeploy::Status.should_receive(:new).
56
- with(:name => 'test-stack').
57
- and_return status_mock
58
- status_mock.should_receive(:wait_for_stable).and_return false
80
+ with(:name => 'test-stack').
81
+ and_return status_mock
82
+ status_mock.stub(:wait_for_stable).and_return true
59
83
  stack_updater = SimpleDeploy::StackUpdater.new :name => 'test-stack',
60
- :template_body => @template_body,
84
+ :template_body => @new_template_body,
61
85
  :entry => entry_mock
62
86
 
63
- lambda {stack_updater.update_stack_if_parameters_changed( [ { 'param1' => 'new-value' } ] ) }.
64
- should raise_error
87
+ stack_updater.update_stack([]).should == true
65
88
  end
66
89
 
67
- it "should not update the stack when parameters don't change" do
68
- attributes = { "param3" => "value3" }
90
+ it "should raise an error when parameters change and stack is not stable" do
91
+ attributes = { "param1" => "value1", "param3" => "value3" }
69
92
  entry_mock = mock 'entry mock'
70
- SimpleDeploy::AWS::CloudFormation.should_receive(:new).exactly(0).times
93
+ status_mock = mock 'status mock'
94
+ cloud_formation_mock = mock 'cloud formation mock'
95
+ SimpleDeploy::AWS::CloudFormation.should_receive(:new).never
96
+ SimpleDeploy::Status.should_receive(:new).
97
+ with(:name => 'test-stack').
98
+ and_return status_mock
99
+ status_mock.stub(:wait_for_stable).and_return false
71
100
  stack_updater = SimpleDeploy::StackUpdater.new :name => 'test-stack',
72
101
  :template_body => @template_body,
73
102
  :entry => entry_mock
74
103
 
75
- stack_updater.update_stack_if_parameters_changed( [ { 'another-param' => 'new-value' } ] ).
76
- should == false
104
+ lambda {stack_updater.update_stack( [ { 'param1' => 'new-value' } ] ) }.
105
+ should raise_error
77
106
  end
78
-
79
107
  end
data/spec/stack_spec.rb CHANGED
@@ -83,8 +83,7 @@ describe SimpleDeploy::Stack do
83
83
  :entry => @entry_mock,
84
84
  :template_body => 'some_json').
85
85
  and_return @stack_updater_mock
86
- @stack_updater_mock.should_receive(:update_stack_if_parameters_changed).
87
- and_return(true)
86
+ @stack_updater_mock.stub(:update_stack).and_return(true)
88
87
  SimpleDeploy::StackReader.should_receive(:new).
89
88
  with(:name => 'test-stack').
90
89
  and_return @stack_reader_mock
@@ -118,8 +117,7 @@ describe SimpleDeploy::Stack do
118
117
  :entry => @entry_mock,
119
118
  :template_body => 'some_json').
120
119
  and_return @stack_updater_mock
121
- @stack_updater_mock.should_receive(:update_stack_if_parameters_changed).
122
- and_return(true)
120
+ @stack_updater_mock.stub(:update_stack).and_return(true)
123
121
  SimpleDeploy::StackReader.should_receive(:new).
124
122
  with(:name => 'test-stack').
125
123
  and_return @stack_reader_mock
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_deploy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.3
4
+ version: 0.7.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-17 00:00:00.000000000 Z
12
+ date: 2013-06-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fakefs
16
- requirement: !ruby/object:Gem::Requirement
16
+ requirement: &70199856979460 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,15 +21,10 @@ dependencies:
21
21
  version: 0.4.2
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ~>
28
- - !ruby/object:Gem::Version
29
- version: 0.4.2
24
+ version_requirements: *70199856979460
30
25
  - !ruby/object:Gem::Dependency
31
26
  name: rake
32
- requirement: !ruby/object:Gem::Requirement
27
+ requirement: &70199856978480 !ruby/object:Gem::Requirement
33
28
  none: false
34
29
  requirements:
35
30
  - - ! '>='
@@ -37,15 +32,10 @@ dependencies:
37
32
  version: '0'
38
33
  type: :development
39
34
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: '0'
35
+ version_requirements: *70199856978480
46
36
  - !ruby/object:Gem::Dependency
47
37
  name: rspec
48
- requirement: !ruby/object:Gem::Requirement
38
+ requirement: &70199857004380 !ruby/object:Gem::Requirement
49
39
  none: false
50
40
  requirements:
51
41
  - - ~>
@@ -53,15 +43,10 @@ dependencies:
53
43
  version: 2.13.0
54
44
  type: :development
55
45
  prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: 2.13.0
46
+ version_requirements: *70199857004380
62
47
  - !ruby/object:Gem::Dependency
63
48
  name: simplecov
64
- requirement: !ruby/object:Gem::Requirement
49
+ requirement: &70199857003340 !ruby/object:Gem::Requirement
65
50
  none: false
66
51
  requirements:
67
52
  - - ~>
@@ -69,15 +54,10 @@ dependencies:
69
54
  version: 0.7.1
70
55
  type: :development
71
56
  prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ~>
76
- - !ruby/object:Gem::Version
77
- version: 0.7.1
57
+ version_requirements: *70199857003340
78
58
  - !ruby/object:Gem::Dependency
79
59
  name: timecop
80
- requirement: !ruby/object:Gem::Requirement
60
+ requirement: &70199857002440 !ruby/object:Gem::Requirement
81
61
  none: false
82
62
  requirements:
83
63
  - - ~>
@@ -85,31 +65,21 @@ dependencies:
85
65
  version: 0.6.1
86
66
  type: :development
87
67
  prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ~>
92
- - !ruby/object:Gem::Version
93
- version: 0.6.1
68
+ version_requirements: *70199857002440
94
69
  - !ruby/object:Gem::Dependency
95
70
  name: capistrano
96
- requirement: !ruby/object:Gem::Requirement
71
+ requirement: &70199857001780 !ruby/object:Gem::Requirement
97
72
  none: false
98
73
  requirements:
99
- - - '='
74
+ - - =
100
75
  - !ruby/object:Gem::Version
101
76
  version: 2.13.5
102
77
  type: :runtime
103
78
  prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
- requirements:
107
- - - '='
108
- - !ruby/object:Gem::Version
109
- version: 2.13.5
79
+ version_requirements: *70199857001780
110
80
  - !ruby/object:Gem::Dependency
111
81
  name: esbit
112
- requirement: !ruby/object:Gem::Requirement
82
+ requirement: &70199857000960 !ruby/object:Gem::Requirement
113
83
  none: false
114
84
  requirements:
115
85
  - - ~>
@@ -117,60 +87,40 @@ dependencies:
117
87
  version: 0.0.4
118
88
  type: :runtime
119
89
  prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
- requirements:
123
- - - ~>
124
- - !ruby/object:Gem::Version
125
- version: 0.0.4
90
+ version_requirements: *70199857000960
126
91
  - !ruby/object:Gem::Dependency
127
92
  name: trollop
128
- requirement: !ruby/object:Gem::Requirement
93
+ requirement: &70199857000240 !ruby/object:Gem::Requirement
129
94
  none: false
130
95
  requirements:
131
- - - '='
96
+ - - =
132
97
  - !ruby/object:Gem::Version
133
98
  version: '2.0'
134
99
  type: :runtime
135
100
  prerelease: false
136
- version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
- requirements:
139
- - - '='
140
- - !ruby/object:Gem::Version
141
- version: '2.0'
101
+ version_requirements: *70199857000240
142
102
  - !ruby/object:Gem::Dependency
143
103
  name: fog
144
- requirement: !ruby/object:Gem::Requirement
104
+ requirement: &70199856999600 !ruby/object:Gem::Requirement
145
105
  none: false
146
106
  requirements:
147
- - - '='
107
+ - - =
148
108
  - !ruby/object:Gem::Version
149
109
  version: 1.10.0
150
110
  type: :runtime
151
111
  prerelease: false
152
- version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
- requirements:
155
- - - '='
156
- - !ruby/object:Gem::Version
157
- version: 1.10.0
112
+ version_requirements: *70199856999600
158
113
  - !ruby/object:Gem::Dependency
159
114
  name: xml-simple
160
- requirement: !ruby/object:Gem::Requirement
115
+ requirement: &70199856999020 !ruby/object:Gem::Requirement
161
116
  none: false
162
117
  requirements:
163
- - - '='
118
+ - - =
164
119
  - !ruby/object:Gem::Version
165
120
  version: 1.1.2
166
121
  type: :runtime
167
122
  prerelease: false
168
- version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
- requirements:
171
- - - '='
172
- - !ruby/object:Gem::Version
173
- version: 1.1.2
123
+ version_requirements: *70199856999020
174
124
  description: Opinionated gem for Managing AWS Cloud Formation stacks and deploying
175
125
  updates to Instances.
176
126
  email:
@@ -296,15 +246,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
296
246
  - - ! '>='
297
247
  - !ruby/object:Gem::Version
298
248
  version: '0'
249
+ segments:
250
+ - 0
251
+ hash: -4463041608859511605
299
252
  required_rubygems_version: !ruby/object:Gem::Requirement
300
253
  none: false
301
254
  requirements:
302
255
  - - ! '>='
303
256
  - !ruby/object:Gem::Version
304
257
  version: '0'
258
+ segments:
259
+ - 0
260
+ hash: -4463041608859511605
305
261
  requirements: []
306
262
  rubyforge_project: simple_deploy
307
- rubygems_version: 1.8.23
263
+ rubygems_version: 1.8.16
308
264
  signing_key:
309
265
  specification_version: 3
310
266
  summary: Opinionated gem for AWS resource management.