simple_deploy 0.9.2 → 0.10.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -0
  3. data/lib/simple_deploy/aws/cloud_formation.rb +5 -5
  4. data/lib/simple_deploy/aws/helpers.rb +20 -0
  5. data/lib/simple_deploy/aws/instance_reader.rb +10 -13
  6. data/lib/simple_deploy/aws/simpledb.rb +5 -5
  7. data/lib/simple_deploy/aws.rb +1 -0
  8. data/lib/simple_deploy/cli/attributes.rb +4 -2
  9. data/lib/simple_deploy/cli/clone.rb +8 -3
  10. data/lib/simple_deploy/cli/create.rb +4 -2
  11. data/lib/simple_deploy/cli/deploy.rb +4 -2
  12. data/lib/simple_deploy/cli/destroy.rb +4 -2
  13. data/lib/simple_deploy/cli/events.rb +4 -2
  14. data/lib/simple_deploy/cli/execute.rb +4 -2
  15. data/lib/simple_deploy/cli/instances.rb +4 -2
  16. data/lib/simple_deploy/cli/list.rb +5 -2
  17. data/lib/simple_deploy/cli/outputs.rb +4 -2
  18. data/lib/simple_deploy/cli/parameters.rb +4 -2
  19. data/lib/simple_deploy/cli/protect.rb +4 -2
  20. data/lib/simple_deploy/cli/resources.rb +4 -2
  21. data/lib/simple_deploy/cli/shared.rb +34 -2
  22. data/lib/simple_deploy/cli/status.rb +4 -2
  23. data/lib/simple_deploy/cli/template.rb +4 -2
  24. data/lib/simple_deploy/cli/update.rb +4 -2
  25. data/lib/simple_deploy/configuration.rb +39 -4
  26. data/lib/simple_deploy/version.rb +1 -1
  27. data/spec/aws/cloud_formation_spec.rb +162 -135
  28. data/spec/aws/helpers_spec.rb +51 -0
  29. data/spec/aws/instance_reader_spec.rb +181 -167
  30. data/spec/aws/simpledb_spec.rb +78 -50
  31. data/spec/cli/attributes_spec.rb +22 -2
  32. data/spec/cli/clone_spec.rb +7 -8
  33. data/spec/cli/deploy_spec.rb +7 -10
  34. data/spec/cli/destroy_spec.rb +3 -4
  35. data/spec/cli/protect_spec.rb +7 -11
  36. data/spec/cli/shared_spec.rb +107 -17
  37. data/spec/cli/update_spec.rb +4 -7
  38. data/spec/config_spec.rb +50 -3
  39. metadata +7 -4
@@ -19,12 +19,14 @@ EOS
19
19
  opt :help, "Display Help"
20
20
  opt :environment, "Set the target environment", :type => :string
21
21
  opt :name, "Stack name to manage", :type => :string
22
+ opt :read_from_env, "Read credentials and region from environment variables"
22
23
  end
23
24
 
24
25
  valid_options? :provided => @opts,
25
- :required => [:environment, :name]
26
+ :required => [:environment, :name, :read_from_env]
26
27
 
27
- SimpleDeploy.create_config @opts[:environment]
28
+ config_arg = @opts[:read_from_env] ? :read_from_env : @opts[:environment]
29
+ SimpleDeploy.create_config config_arg
28
30
  SimpleDeploy.logger @opts[:log_level]
29
31
  stack = Stack.new :name => @opts[:name],
30
32
  :environment => @opts[:environment]
@@ -19,12 +19,14 @@ EOS
19
19
  opt :help, "Display Help"
20
20
  opt :environment, "Set the target environment", :type => :string
21
21
  opt :name, "Stack name to manage", :type => :string
22
+ opt :read_from_env, "Read credentials and region from environment variables"
22
23
  end
23
24
 
24
25
  valid_options? :provided => @opts,
25
- :required => [:environment, :name]
26
+ :required => [:environment, :name, :read_from_env]
26
27
 
27
- SimpleDeploy.create_config @opts[:environment]
28
+ config_arg = @opts[:read_from_env] ? :read_from_env : @opts[:environment]
29
+ SimpleDeploy.create_config config_arg
28
30
  SimpleDeploy.logger @opts[:log_level]
29
31
  stack = Stack.new :name => @opts[:name],
30
32
  :environment => @opts[:environment]
@@ -25,13 +25,15 @@ EOS
25
25
  :default => 'info'
26
26
  opt :name, "Stack name(s) of stack to deploy", :type => :string,
27
27
  :multi => true
28
+ opt :read_from_env, "Read credentials and region from environment variables"
28
29
  opt :template, "Path to a new template file", :type => :string
29
30
  end
30
31
 
31
32
  valid_options? :provided => @opts,
32
- :required => [:environment, :name]
33
+ :required => [:environment, :name, :read_from_env]
33
34
 
34
- SimpleDeploy.create_config @opts[:environment]
35
+ config_arg = @opts[:read_from_env] ? :read_from_env : @opts[:environment]
36
+ SimpleDeploy.create_config config_arg
35
37
  SimpleDeploy.logger @opts[:log_level]
36
38
 
37
39
  attributes = parse_attributes :attributes => @opts[:attributes]
@@ -4,9 +4,13 @@ module SimpleDeploy
4
4
  extend self
5
5
 
6
6
  def configure(environment, custom_config = {})
7
- raw_config = custom_config.fetch(:config) { load_config_file }
8
- Config.new raw_config['environments'][environment],
9
- raw_config['notifications']
7
+ if custom_config.has_key?(:config)
8
+ env_config = custom_config[:config]['environments'][environment]
9
+ notifications = custom_config[:config]['notifications']
10
+ else
11
+ env_config, notifications = load_appropriate_config(environment)
12
+ end
13
+ Config.new env_config, notifications
10
14
  end
11
15
 
12
16
  def environments(custom_config = {})
@@ -16,6 +20,14 @@ module SimpleDeploy
16
20
 
17
21
  private
18
22
 
23
+ def load_appropriate_config(env)
24
+ if env == :read_from_env
25
+ load_config_from_env_vars
26
+ else
27
+ load_config_from_file env
28
+ end
29
+ end
30
+
19
31
  def load_config_file
20
32
  begin
21
33
  YAML::load File.open(config_file)
@@ -26,6 +38,22 @@ module SimpleDeploy
26
38
  end
27
39
  end
28
40
 
41
+ def load_config_from_file(env)
42
+ config = load_config_file
43
+ return config['environments'][env], config['notifications']
44
+ end
45
+
46
+ def load_config_from_env_vars
47
+ env_config = {
48
+ 'access_key' => ENV['AWS_ACCESS_KEY_ID'],
49
+ 'region' => ENV['AWS_REGION'],
50
+ 'secret_key' => ENV['AWS_SECRET_ACCESS_KEY'],
51
+ 'security_token' => ENV['AWS_SECURITY_TOKEN']
52
+ }
53
+
54
+ return env_config, {}
55
+ end
56
+
29
57
  def config_file
30
58
  env_config_file || default_config_file
31
59
  end
@@ -82,10 +110,18 @@ module SimpleDeploy
82
110
  @environment['secret_key']
83
111
  end
84
112
 
113
+ def security_token
114
+ @environment['security_token']
115
+ end
116
+
85
117
  def region
86
118
  @environment['region']
87
119
  end
88
120
 
121
+ def temporary_credentials?
122
+ !!security_token
123
+ end
124
+
89
125
  private
90
126
 
91
127
  def env_home
@@ -96,7 +132,6 @@ module SimpleDeploy
96
132
  env.load 'USER'
97
133
  end
98
134
 
99
-
100
135
  end
101
136
  end
102
137
  end
@@ -1,3 +1,3 @@
1
1
  module SimpleDeploy
2
- VERSION = "0.9.2"
2
+ VERSION = "0.10.0.beta.1"
3
3
  end
@@ -1,23 +1,17 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe SimpleDeploy::AWS::CloudFormation do
4
- include_context 'double stubbed config', :access_key => 'key',
5
- :secret_key => 'XXX',
6
- :region => 'us-west-1'
7
4
  include_context 'double stubbed logger'
8
5
 
9
6
  before do
10
7
  @error_stub = stub 'Error', :process => 'Processed Error'
11
- @response_stub = stub 'Excon::Response', :body => {
8
+ @response_stub = stub 'Excon::Response', :body => {
12
9
  'Stacks' => [{'StackStatus' => 'green', 'Outputs' => [{'key' => 'value'}]}],
13
10
  'StackResources' => [{'StackName' => 'my_stack'}],
14
11
  'StackEvents' => ['event1', 'event2'],
15
12
  'TemplateBody' => '{EIP: "string"}'
16
13
  }
17
14
 
18
- @cf_mock = mock 'CloudFormation'
19
- Fog::AWS::CloudFormation.stub(:new).and_return(@cf_mock)
20
-
21
15
  @args = {
22
16
  :parameters => { 'parameter1' => 'my_param' },
23
17
  :name => 'my_stack',
@@ -25,183 +19,216 @@ describe SimpleDeploy::AWS::CloudFormation do
25
19
  }
26
20
 
27
21
  @exception = Exception.new('Failed')
28
-
29
- @cf = SimpleDeploy::AWS::CloudFormation.new
30
22
  end
31
23
 
32
24
  after do
33
25
  SimpleDeploy.release_config
34
26
  end
35
27
 
36
- describe "create" do
37
- it "should create the stack on Cloud Formation" do
38
- @cf_mock.should_receive(:create_stack).with('my_stack',
39
- { 'Capabilities' => ['CAPABILITY_IAM'],
40
- 'TemplateBody' => 'my_template',
41
- 'Parameters' => { 'parameter1' => 'my_param' }
42
- })
28
+ describe 'temporary credentials' do
29
+ include_context 'double stubbed config', :access_key => 'key',
30
+ :secret_key => 'XXX',
31
+ :security_token => 'the token',
32
+ :temporary_credentials? => true,
33
+ :region => 'us-west-1'
43
34
 
44
- @cf.create(@args)
35
+ it 'creates a connection with the temporary credentials' do
36
+ args = {
37
+ aws_access_key_id: 'key',
38
+ aws_secret_access_key: 'XXX',
39
+ aws_session_token: 'the token',
40
+ region: 'us-west-1'
41
+ }
42
+ Fog::AWS::CloudFormation.should_receive(:new).with(args)
43
+ SimpleDeploy::AWS::CloudFormation.new
45
44
  end
46
45
 
47
- it "should trap and re-raise exceptions as SimpleDeploy::Exceptions::CloudFormationError" do
48
- @cf_mock.should_receive(:create_stack).with('my_stack',
49
- { 'Capabilities' => ['CAPABILITY_IAM'],
50
- 'TemplateBody' => 'my_template',
51
- 'Parameters' => { 'parameter1' => 'my_param' }
52
- }).and_raise(@exception)
46
+ end
53
47
 
54
- SimpleDeploy::AWS::CloudFormation::Error.should_receive(:new).
55
- with(:exception => @exception).
56
- and_raise SimpleDeploy::Exceptions::CloudFormationError.new('failed')
48
+ describe 'with long lived credentials' do
49
+ include_context 'double stubbed config', :access_key => 'key',
50
+ :secret_key => 'XXX',
51
+ :security_token => nil,
52
+ :temporary_credentials? => false,
53
+ :region => 'us-west-1'
54
+ before do
55
+ @cf_mock = mock 'CloudFormation'
56
+ Fog::AWS::CloudFormation.stub(:new).and_return(@cf_mock)
57
57
 
58
- lambda { @cf.create @args }.
59
- should raise_error SimpleDeploy::Exceptions::CloudFormationError
58
+ @cf = SimpleDeploy::AWS::CloudFormation.new
60
59
  end
61
- end
62
60
 
63
- describe "update" do
64
- it "should update the stack on Cloud Formation" do
65
- @cf_mock.should_receive(:update_stack).with('my_stack',
66
- { 'Capabilities' => ['CAPABILITY_IAM'],
67
- 'TemplateBody' => 'my_template',
68
- 'Parameters' => { 'parameter1' => 'my_param' }
69
- })
61
+ describe "create" do
62
+ it "should create the stack on Cloud Formation" do
63
+ @cf_mock.should_receive(:create_stack).with('my_stack',
64
+ { 'Capabilities' => ['CAPABILITY_IAM'],
65
+ 'TemplateBody' => 'my_template',
66
+ 'Parameters' => { 'parameter1' => 'my_param' }
67
+ })
68
+
69
+ @cf.create(@args)
70
+ end
71
+
72
+ it "should trap and re-raise exceptions as SimpleDeploy::Exceptions::CloudFormationError" do
73
+ @cf_mock.should_receive(:create_stack).with('my_stack',
74
+ { 'Capabilities' => ['CAPABILITY_IAM'],
75
+ 'TemplateBody' => 'my_template',
76
+ 'Parameters' => { 'parameter1' => 'my_param' }
77
+ }).and_raise(@exception)
78
+
79
+ SimpleDeploy::AWS::CloudFormation::Error.should_receive(:new).
80
+ with(:exception => @exception).
81
+ and_raise SimpleDeploy::Exceptions::CloudFormationError.new('failed')
70
82
 
71
- @cf.update(@args)
72
- end
83
+ lambda { @cf.create @args }.
84
+ should raise_error SimpleDeploy::Exceptions::CloudFormationError
85
+ end
86
+ end
73
87
 
74
- it "should trap and re-raise exceptions as SimpleDeploy::Exceptions::CloudFormationError" do
75
- @cf_mock.should_receive(:update_stack).with('my_stack',
76
- { 'Capabilities' => ['CAPABILITY_IAM'],
77
- 'TemplateBody' => 'my_template',
78
- 'Parameters' => { 'parameter1' => 'my_param' }
79
- }).and_raise(@exception)
80
- SimpleDeploy::AWS::CloudFormation::Error.should_receive(:new).
81
- with(:exception => @exception).
82
- and_raise SimpleDeploy::Exceptions::CloudFormationError.new('failed')
83
-
84
- lambda { @cf.update(@args) }.
85
- should raise_error SimpleDeploy::Exceptions::CloudFormationError
86
- end
87
- end
88
+ describe "update" do
89
+ it "should update the stack on Cloud Formation" do
90
+ @cf_mock.should_receive(:update_stack).with('my_stack',
91
+ { 'Capabilities' => ['CAPABILITY_IAM'],
92
+ 'TemplateBody' => 'my_template',
93
+ 'Parameters' => { 'parameter1' => 'my_param' }
94
+ })
88
95
 
96
+ @cf.update(@args)
97
+ end
89
98
 
90
- describe 'destroy' do
91
- it "should delete the stack on Cloud Formation" do
92
- @cf_mock.should_receive(:delete_stack).with('my_stack')
99
+ it "should trap and re-raise exceptions as SimpleDeploy::Exceptions::CloudFormationError" do
100
+ @cf_mock.should_receive(:update_stack).with('my_stack',
101
+ { 'Capabilities' => ['CAPABILITY_IAM'],
102
+ 'TemplateBody' => 'my_template',
103
+ 'Parameters' => { 'parameter1' => 'my_param' }
104
+ }).and_raise(@exception)
105
+ SimpleDeploy::AWS::CloudFormation::Error.should_receive(:new).
106
+ with(:exception => @exception).
107
+ and_raise SimpleDeploy::Exceptions::CloudFormationError.new('failed')
93
108
 
94
- @cf.destroy('my_stack')
109
+ lambda { @cf.update(@args) }.
110
+ should raise_error SimpleDeploy::Exceptions::CloudFormationError
111
+ end
95
112
  end
96
113
 
97
- it "should trap and re-raise exceptions as SimpleDeploy::Exceptions::CloudFormationError" do
98
- @cf_mock.should_receive(:delete_stack).
99
- with('my_stack').
100
- and_raise @exception
101
- SimpleDeploy::AWS::CloudFormation::Error.should_receive(:new).
102
- with(:exception => @exception).
103
- and_raise SimpleDeploy::Exceptions::CloudFormationError.new('failed')
104
114
 
105
- lambda { @cf.destroy('my_stack') }.
106
- should raise_error SimpleDeploy::Exceptions::CloudFormationError
107
- end
108
- end
115
+ describe 'destroy' do
116
+ it "should delete the stack on Cloud Formation" do
117
+ @cf_mock.should_receive(:delete_stack).with('my_stack')
109
118
 
119
+ @cf.destroy('my_stack')
120
+ end
110
121
 
111
- describe 'describe_stack' do
112
- it "should return the Cloud Formation description of the stack" do
113
- @cf_mock.should_receive(:describe_stacks).with('StackName' => 'my_stack').and_return(@response_stub)
122
+ it "should trap and re-raise exceptions as SimpleDeploy::Exceptions::CloudFormationError" do
123
+ @cf_mock.should_receive(:delete_stack).
124
+ with('my_stack').
125
+ and_raise @exception
126
+ SimpleDeploy::AWS::CloudFormation::Error.should_receive(:new).
127
+ with(:exception => @exception).
128
+ and_raise SimpleDeploy::Exceptions::CloudFormationError.new('failed')
114
129
 
115
- @cf.describe_stack('my_stack').should == [{'StackStatus' => 'green', 'Outputs' => [{'key' => 'value'}]}]
130
+ lambda { @cf.destroy('my_stack') }.
131
+ should raise_error SimpleDeploy::Exceptions::CloudFormationError
132
+ end
116
133
  end
117
134
 
118
- it "should trap and re-raise exceptions as SimpleDeploy::Exceptions::CloudFormationError" do
119
- @cf_mock.should_receive(:describe_stacks).
120
- with('StackName' => 'my_stack').
121
- and_raise @exception
122
- SimpleDeploy::AWS::CloudFormation::Error.should_receive(:new).
123
- with(:exception => @exception).
124
- and_raise SimpleDeploy::Exceptions::CloudFormationError.new('failed')
125
135
 
126
- lambda { @cf.describe_stack('my_stack') }.
127
- should raise_error SimpleDeploy::Exceptions::CloudFormationError
128
- end
129
- end
136
+ describe 'describe_stack' do
137
+ it "should return the Cloud Formation description of the stack" do
138
+ @cf_mock.should_receive(:describe_stacks).with('StackName' => 'my_stack').and_return(@response_stub)
130
139
 
131
- describe "stack_resources" do
132
- it "should return the Cloud Formation description of the stack resources" do
133
- @cf_mock.should_receive(:describe_stack_resources).with('StackName' => 'my_stack').and_return(@response_stub)
140
+ @cf.describe_stack('my_stack').should == [{'StackStatus' => 'green', 'Outputs' => [{'key' => 'value'}]}]
141
+ end
134
142
 
135
- @cf.stack_resources('my_stack').should == [{'StackName' => 'my_stack'}]
143
+ it "should trap and re-raise exceptions as SimpleDeploy::Exceptions::CloudFormationError" do
144
+ @cf_mock.should_receive(:describe_stacks).
145
+ with('StackName' => 'my_stack').
146
+ and_raise @exception
147
+ SimpleDeploy::AWS::CloudFormation::Error.should_receive(:new).
148
+ with(:exception => @exception).
149
+ and_raise SimpleDeploy::Exceptions::CloudFormationError.new('failed')
150
+
151
+ lambda { @cf.describe_stack('my_stack') }.
152
+ should raise_error SimpleDeploy::Exceptions::CloudFormationError
153
+ end
136
154
  end
137
155
 
138
- it "should trap and re-raise exceptions as SimpleDeploy::Exceptions::CloudFormationError" do
139
- @cf_mock.should_receive(:describe_stack_resources).
140
- with('StackName' => 'my_stack').
141
- and_raise @exception
142
- SimpleDeploy::AWS::CloudFormation::Error.should_receive(:new).
143
- with(:exception => @exception).
144
- and_raise SimpleDeploy::Exceptions::CloudFormationError.new('failed')
156
+ describe "stack_resources" do
157
+ it "should return the Cloud Formation description of the stack resources" do
158
+ @cf_mock.should_receive(:describe_stack_resources).with('StackName' => 'my_stack').and_return(@response_stub)
145
159
 
146
- lambda { @cf.stack_resources('my_stack') }.
147
- should raise_error SimpleDeploy::Exceptions::CloudFormationError
148
- end
149
- end
160
+ @cf.stack_resources('my_stack').should == [{'StackName' => 'my_stack'}]
161
+ end
150
162
 
151
- describe "stack_events" do
152
- it "should return the Cloud Formation description of the stack events" do
153
- @cf_mock.should_receive(:describe_stack_events).with('my_stack').and_return(@response_stub)
163
+ it "should trap and re-raise exceptions as SimpleDeploy::Exceptions::CloudFormationError" do
164
+ @cf_mock.should_receive(:describe_stack_resources).
165
+ with('StackName' => 'my_stack').
166
+ and_raise @exception
167
+ SimpleDeploy::AWS::CloudFormation::Error.should_receive(:new).
168
+ with(:exception => @exception).
169
+ and_raise SimpleDeploy::Exceptions::CloudFormationError.new('failed')
154
170
 
155
- @cf.stack_events('my_stack', 2).should == ['event1', 'event2']
171
+ lambda { @cf.stack_resources('my_stack') }.
172
+ should raise_error SimpleDeploy::Exceptions::CloudFormationError
173
+ end
156
174
  end
157
175
 
158
- it "should trap and re-raise exceptions as SimpleDeploy::Exceptions::CloudFormationError" do
159
- @cf_mock.should_receive(:describe_stack_events).
160
- with('my_stack').
161
- and_raise @exception
176
+ describe "stack_events" do
177
+ it "should return the Cloud Formation description of the stack events" do
178
+ @cf_mock.should_receive(:describe_stack_events).with('my_stack').and_return(@response_stub)
162
179
 
163
- SimpleDeploy::AWS::CloudFormation::Error.should_receive(:new).
164
- with(:exception => @exception).
165
- and_raise SimpleDeploy::Exceptions::CloudFormationError.new('failed')
180
+ @cf.stack_events('my_stack', 2).should == ['event1', 'event2']
181
+ end
166
182
 
167
- lambda { @cf.stack_events('my_stack', 2) }.
168
- should raise_error SimpleDeploy::Exceptions::CloudFormationError
169
- end
170
- end
183
+ it "should trap and re-raise exceptions as SimpleDeploy::Exceptions::CloudFormationError" do
184
+ @cf_mock.should_receive(:describe_stack_events).
185
+ with('my_stack').
186
+ and_raise @exception
171
187
 
172
- describe "stack_status" do
173
- it "should return the Cloud Formation status of the stack" do
174
- @cf_mock.should_receive(:describe_stacks).with('StackName' => 'my_stack').and_return(@response_stub)
188
+ SimpleDeploy::AWS::CloudFormation::Error.should_receive(:new).
189
+ with(:exception => @exception).
190
+ and_raise SimpleDeploy::Exceptions::CloudFormationError.new('failed')
175
191
 
176
- @cf.stack_status('my_stack').should == 'green'
192
+ lambda { @cf.stack_events('my_stack', 2) }.
193
+ should raise_error SimpleDeploy::Exceptions::CloudFormationError
194
+ end
177
195
  end
178
- end
179
196
 
180
- describe "stack_outputs" do
181
- it "should return the Cloud Formation outputs for the stack" do
182
- @cf_mock.should_receive(:describe_stacks).with('StackName' => 'my_stack').and_return(@response_stub)
197
+ describe "stack_status" do
198
+ it "should return the Cloud Formation status of the stack" do
199
+ @cf_mock.should_receive(:describe_stacks).with('StackName' => 'my_stack').and_return(@response_stub)
183
200
 
184
- @cf.stack_outputs('my_stack').should == [{'key' => 'value'}]
201
+ @cf.stack_status('my_stack').should == 'green'
202
+ end
185
203
  end
186
- end
187
204
 
188
- describe "template" do
189
- it "should return the Cloud Formation template for the stack" do
190
- @cf_mock.should_receive(:get_template).with('my_stack').and_return(@response_stub)
205
+ describe "stack_outputs" do
206
+ it "should return the Cloud Formation outputs for the stack" do
207
+ @cf_mock.should_receive(:describe_stacks).with('StackName' => 'my_stack').and_return(@response_stub)
191
208
 
192
- @cf.template('my_stack').should == '{EIP: "string"}'
209
+ @cf.stack_outputs('my_stack').should == [{'key' => 'value'}]
210
+ end
193
211
  end
194
212
 
195
- it "should trap and re-raise exceptions as SimpleDeploy::Exceptions::CloudFormationError" do
196
- @cf_mock.should_receive(:get_template).
197
- with('my_stack').
198
- and_raise @exception
199
- SimpleDeploy::AWS::CloudFormation::Error.should_receive(:new).
200
- with(:exception => @exception).
201
- and_raise SimpleDeploy::Exceptions::CloudFormationError.new('failed')
213
+ describe "template" do
214
+ it "should return the Cloud Formation template for the stack" do
215
+ @cf_mock.should_receive(:get_template).with('my_stack').and_return(@response_stub)
216
+
217
+ @cf.template('my_stack').should == '{EIP: "string"}'
218
+ end
202
219
 
203
- lambda { @cf.template('my_stack') }.
204
- should raise_error SimpleDeploy::Exceptions::CloudFormationError
220
+ it "should trap and re-raise exceptions as SimpleDeploy::Exceptions::CloudFormationError" do
221
+ @cf_mock.should_receive(:get_template).
222
+ with('my_stack').
223
+ and_raise @exception
224
+ SimpleDeploy::AWS::CloudFormation::Error.should_receive(:new).
225
+ with(:exception => @exception).
226
+ and_raise SimpleDeploy::Exceptions::CloudFormationError.new('failed')
227
+
228
+ lambda { @cf.template('my_stack') }.
229
+ should raise_error SimpleDeploy::Exceptions::CloudFormationError
230
+ end
205
231
  end
206
232
  end
233
+
207
234
  end