simple_deploy 0.9.2 → 0.10.0.beta.1

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.
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