simple_deploy 0.7.3 → 0.7.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.
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.