stackster 0.3.2 → 0.4.0
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/.rvmrc +1 -1
- data/CHANGELOG +6 -0
- data/lib/stackster.rb +1 -0
- data/lib/stackster/aws/cloud_formation/error.rb +4 -1
- data/lib/stackster/exceptions.rb +17 -0
- data/lib/stackster/version.rb +1 -1
- data/spec/aws/cloud_formation/error_spec.rb +22 -4
- data/spec/aws/cloud_formation_spec.rb +52 -26
- metadata +23 -57
data/.rvmrc
CHANGED
@@ -1 +1 @@
|
|
1
|
-
rvm use ruby-1.9.3-
|
1
|
+
rvm use ruby-1.9.3-p327@stackster --create
|
data/CHANGELOG
CHANGED
data/lib/stackster.rb
CHANGED
@@ -17,9 +17,12 @@ module Stackster
|
|
17
17
|
case msg
|
18
18
|
when 'No updates are to be performed.'
|
19
19
|
@logger.info msg
|
20
|
+
when /^Stack:(.*) does not exist$/
|
21
|
+
@logger.error msg
|
22
|
+
raise Stackster::Exceptions::UnknownStack.new msg
|
20
23
|
else
|
21
24
|
@logger.error msg
|
22
|
-
|
25
|
+
raise Stackster::Exceptions::CloudFormationError.new msg
|
23
26
|
end
|
24
27
|
end
|
25
28
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Stackster
|
2
|
+
module Exceptions
|
3
|
+
class Base < RuntimeError
|
4
|
+
attr_accessor :message
|
5
|
+
|
6
|
+
def initialize(message="")
|
7
|
+
@message = message
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class CloudFormationError < Base
|
12
|
+
end
|
13
|
+
|
14
|
+
class UnknownStack < Base
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/stackster/version.rb
CHANGED
@@ -13,6 +13,10 @@ describe Stackster do
|
|
13
13
|
@exception_stub2 = stub 'Excon::Response'
|
14
14
|
@exception_stub2.stub(:response).and_return(@exception_stub2)
|
15
15
|
@exception_stub2.stub(:body).and_return('<opt><Error><Message>Oops.</Message></Error></opt>')
|
16
|
+
|
17
|
+
@exception_stub3 = stub 'Excon::Response'
|
18
|
+
@exception_stub3.stub(:response).and_return(@exception_stub3)
|
19
|
+
@exception_stub3.stub(:body).and_return('<opt><Error><Message>Stack:test does not exist</Message></Error></opt>')
|
16
20
|
end
|
17
21
|
|
18
22
|
describe 'process' do
|
@@ -23,17 +27,31 @@ describe Stackster do
|
|
23
27
|
error.process
|
24
28
|
end
|
25
29
|
|
26
|
-
it 'should
|
30
|
+
it 'should re-raise unkonwn errors as Stackster::CloudFormationError' do
|
27
31
|
@logger_mock.should_receive(:error).with('Oops.')
|
28
32
|
|
29
33
|
error = Stackster::AWS::CloudFormation::Error.new :exception => @exception_stub2, :config => @config_stub
|
30
34
|
|
35
|
+
lambda { error.process }.should raise_error Stackster::Exceptions::CloudFormationError
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should re-raise unkonwn errors as Stackster::CloudFormationError and set mesg' do
|
39
|
+
@logger_mock.should_receive(:error).with('Oops.')
|
40
|
+
|
41
|
+
error = Stackster::AWS::CloudFormation::Error.new :exception => @exception_stub2, :config => @config_stub
|
31
42
|
begin
|
32
43
|
error.process
|
33
|
-
|
34
|
-
|
35
|
-
e.status.should == 1
|
44
|
+
rescue Stackster::Exceptions::CloudFormationError => e
|
45
|
+
e.message.should == "Oops."
|
36
46
|
end
|
37
47
|
end
|
48
|
+
|
49
|
+
it 'should reaise stck unkown messages as Stackster::UnknownStack' do
|
50
|
+
@logger_mock.should_receive(:error).with('Stack:test does not exist')
|
51
|
+
|
52
|
+
error = Stackster::AWS::CloudFormation::Error.new :exception => @exception_stub3, :config => @config_stub
|
53
|
+
lambda { error.process }.should raise_error Stackster::Exceptions::UnknownStack
|
54
|
+
end
|
55
|
+
|
38
56
|
end
|
39
57
|
end
|
@@ -37,16 +37,19 @@ describe Stackster do
|
|
37
37
|
@cf.create(@args)
|
38
38
|
end
|
39
39
|
|
40
|
-
it "should trap exceptions" do
|
40
|
+
it "should trap and re-raise exceptions as Stackster::Exceptions::CloudFormationError" do
|
41
41
|
@cf_mock.should_receive(:create_stack).with('my_stack',
|
42
42
|
{ 'Capabilities' => ['CAPABILITY_IAM'],
|
43
43
|
'TemplateBody' => 'my_template',
|
44
44
|
'Parameters' => { 'parameter1' => 'my_param' }
|
45
45
|
}).and_raise(@exception)
|
46
|
+
|
46
47
|
Stackster::AWS::CloudFormation::Error.should_receive(:new).
|
47
|
-
with(:config => @config_stub, :exception => @exception).
|
48
|
+
with(:config => @config_stub, :exception => @exception).
|
49
|
+
and_raise Stackster::Exceptions::CloudFormationError.new('failed')
|
48
50
|
|
49
|
-
@cf.create
|
51
|
+
lambda { @cf.create @args }.
|
52
|
+
should raise_error Stackster::Exceptions::CloudFormationError
|
50
53
|
end
|
51
54
|
end
|
52
55
|
|
@@ -61,16 +64,18 @@ describe Stackster do
|
|
61
64
|
@cf.update(@args)
|
62
65
|
end
|
63
66
|
|
64
|
-
it "should trap exceptions" do
|
67
|
+
it "should trap and re-raise exceptions as Stackster::Exceptions::CloudFormationError" do
|
65
68
|
@cf_mock.should_receive(:update_stack).with('my_stack',
|
66
69
|
{ 'Capabilities' => ['CAPABILITY_IAM'],
|
67
70
|
'TemplateBody' => 'my_template',
|
68
71
|
'Parameters' => { 'parameter1' => 'my_param' }
|
69
72
|
}).and_raise(@exception)
|
70
73
|
Stackster::AWS::CloudFormation::Error.should_receive(:new).
|
71
|
-
with(:config => @config_stub, :exception => @exception).
|
74
|
+
with(:config => @config_stub, :exception => @exception).
|
75
|
+
and_raise Stackster::Exceptions::CloudFormationError.new('failed')
|
72
76
|
|
73
|
-
@cf.update(@args).
|
77
|
+
lambda { @cf.update(@args) }.
|
78
|
+
should raise_error Stackster::Exceptions::CloudFormationError
|
74
79
|
end
|
75
80
|
end
|
76
81
|
|
@@ -82,12 +87,16 @@ describe Stackster do
|
|
82
87
|
@cf.destroy('my_stack')
|
83
88
|
end
|
84
89
|
|
85
|
-
it "should trap exceptions" do
|
86
|
-
@cf_mock.should_receive(:delete_stack).
|
90
|
+
it "should trap and re-raise exceptions as Stackster::Exceptions::CloudFormationError" do
|
91
|
+
@cf_mock.should_receive(:delete_stack).
|
92
|
+
with('my_stack').
|
93
|
+
and_raise @exception
|
87
94
|
Stackster::AWS::CloudFormation::Error.should_receive(:new).
|
88
|
-
with(:config => @config_stub, :exception => @exception).
|
95
|
+
with(:config => @config_stub, :exception => @exception).
|
96
|
+
and_raise Stackster::Exceptions::CloudFormationError.new('failed')
|
89
97
|
|
90
|
-
@cf.destroy('my_stack').
|
98
|
+
lambda { @cf.destroy('my_stack') }.
|
99
|
+
should raise_error Stackster::Exceptions::CloudFormationError
|
91
100
|
end
|
92
101
|
end
|
93
102
|
|
@@ -99,12 +108,16 @@ describe Stackster do
|
|
99
108
|
@cf.describe_stack('my_stack').should == [{'StackStatus' => 'green', 'Outputs' => [{'key' => 'value'}]}]
|
100
109
|
end
|
101
110
|
|
102
|
-
it "should trap exceptions" do
|
103
|
-
@cf_mock.should_receive(:describe_stacks).
|
111
|
+
it "should trap and re-raise exceptions as Stackster::Exceptions::CloudFormationError" do
|
112
|
+
@cf_mock.should_receive(:describe_stacks).
|
113
|
+
with('StackName' => 'my_stack').
|
114
|
+
and_raise @exception
|
104
115
|
Stackster::AWS::CloudFormation::Error.should_receive(:new).
|
105
|
-
with(:config => @config_stub, :exception => @exception).
|
116
|
+
with(:config => @config_stub, :exception => @exception).
|
117
|
+
and_raise Stackster::Exceptions::CloudFormationError.new('failed')
|
106
118
|
|
107
|
-
@cf.describe_stack('my_stack').
|
119
|
+
lambda { @cf.describe_stack('my_stack') }.
|
120
|
+
should raise_error Stackster::Exceptions::CloudFormationError
|
108
121
|
end
|
109
122
|
end
|
110
123
|
|
@@ -115,12 +128,16 @@ describe Stackster do
|
|
115
128
|
@cf.stack_resources('my_stack').should == [{'StackName' => 'my_stack'}]
|
116
129
|
end
|
117
130
|
|
118
|
-
it "should trap exceptions" do
|
119
|
-
@cf_mock.should_receive(:describe_stack_resources).
|
131
|
+
it "should trap and re-raise exceptions as Stackster::Exceptions::CloudFormationError" do
|
132
|
+
@cf_mock.should_receive(:describe_stack_resources).
|
133
|
+
with('StackName' => 'my_stack').
|
134
|
+
and_raise @exception
|
120
135
|
Stackster::AWS::CloudFormation::Error.should_receive(:new).
|
121
|
-
with(:config => @config_stub, :exception => @exception).
|
136
|
+
with(:config => @config_stub, :exception => @exception).
|
137
|
+
and_raise Stackster::Exceptions::CloudFormationError.new('failed')
|
122
138
|
|
123
|
-
@cf.stack_resources('my_stack').
|
139
|
+
lambda { @cf.stack_resources('my_stack') }.
|
140
|
+
should raise_error Stackster::Exceptions::CloudFormationError
|
124
141
|
end
|
125
142
|
end
|
126
143
|
|
@@ -131,12 +148,17 @@ describe Stackster do
|
|
131
148
|
@cf.stack_events('my_stack', 2).should == ['event1', 'event2']
|
132
149
|
end
|
133
150
|
|
134
|
-
it "should trap exceptions" do
|
135
|
-
@cf_mock.should_receive(:describe_stack_events).
|
151
|
+
it "should trap and re-raise exceptions as Stackster::Exceptions::CloudFormationError" do
|
152
|
+
@cf_mock.should_receive(:describe_stack_events).
|
153
|
+
with('my_stack').
|
154
|
+
and_raise @exception
|
155
|
+
|
136
156
|
Stackster::AWS::CloudFormation::Error.should_receive(:new).
|
137
|
-
with(:config => @config_stub, :exception => @exception).
|
157
|
+
with(:config => @config_stub, :exception => @exception).
|
158
|
+
and_raise Stackster::Exceptions::CloudFormationError.new('failed')
|
138
159
|
|
139
|
-
@cf.stack_events('my_stack', 2).
|
160
|
+
lambda { @cf.stack_events('my_stack', 2) }.
|
161
|
+
should raise_error Stackster::Exceptions::CloudFormationError
|
140
162
|
end
|
141
163
|
end
|
142
164
|
|
@@ -163,12 +185,16 @@ describe Stackster do
|
|
163
185
|
@cf.template('my_stack').should == '{EIP: "string"}'
|
164
186
|
end
|
165
187
|
|
166
|
-
it "should trap exceptions" do
|
167
|
-
@cf_mock.should_receive(:get_template).
|
188
|
+
it "should trap and re-raise exceptions as Stackster::Exceptions::CloudFormationError" do
|
189
|
+
@cf_mock.should_receive(:get_template).
|
190
|
+
with('my_stack').
|
191
|
+
and_raise @exception
|
168
192
|
Stackster::AWS::CloudFormation::Error.should_receive(:new).
|
169
|
-
with(:config => @config_stub, :exception => @exception).
|
193
|
+
with(:config => @config_stub, :exception => @exception).
|
194
|
+
and_raise Stackster::Exceptions::CloudFormationError.new('failed')
|
170
195
|
|
171
|
-
@cf.template('my_stack').
|
196
|
+
lambda { @cf.template('my_stack') }.
|
197
|
+
should raise_error Stackster::Exceptions::CloudFormationError
|
172
198
|
end
|
173
199
|
end
|
174
200
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stackster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
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: 2012-11
|
12
|
+
date: 2012-12-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70363866364540 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,15 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ! '>='
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '0'
|
24
|
+
version_requirements: *70363866364540
|
30
25
|
- !ruby/object:Gem::Dependency
|
31
26
|
name: rspec
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
27
|
+
requirement: &70363866362780 !ruby/object:Gem::Requirement
|
33
28
|
none: false
|
34
29
|
requirements:
|
35
30
|
- - ~>
|
@@ -37,15 +32,10 @@ dependencies:
|
|
37
32
|
version: 2.11.0
|
38
33
|
type: :development
|
39
34
|
prerelease: false
|
40
|
-
version_requirements:
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ~>
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: 2.11.0
|
35
|
+
version_requirements: *70363866362780
|
46
36
|
- !ruby/object:Gem::Dependency
|
47
37
|
name: simplecov
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
38
|
+
requirement: &70363866361660 !ruby/object:Gem::Requirement
|
49
39
|
none: false
|
50
40
|
requirements:
|
51
41
|
- - ~>
|
@@ -53,15 +43,10 @@ dependencies:
|
|
53
43
|
version: 0.6.4
|
54
44
|
type: :development
|
55
45
|
prerelease: false
|
56
|
-
version_requirements:
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 0.6.4
|
46
|
+
version_requirements: *70363866361660
|
62
47
|
- !ruby/object:Gem::Dependency
|
63
48
|
name: timecop
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
+
requirement: &70363866360020 !ruby/object:Gem::Requirement
|
65
50
|
none: false
|
66
51
|
requirements:
|
67
52
|
- - ~>
|
@@ -69,60 +54,40 @@ dependencies:
|
|
69
54
|
version: 0.5.3
|
70
55
|
type: :development
|
71
56
|
prerelease: false
|
72
|
-
version_requirements:
|
73
|
-
none: false
|
74
|
-
requirements:
|
75
|
-
- - ~>
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: 0.5.3
|
57
|
+
version_requirements: *70363866360020
|
78
58
|
- !ruby/object:Gem::Dependency
|
79
59
|
name: fog
|
80
|
-
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirement: &70363866374520 !ruby/object:Gem::Requirement
|
81
61
|
none: false
|
82
62
|
requirements:
|
83
|
-
- -
|
63
|
+
- - =
|
84
64
|
- !ruby/object:Gem::Version
|
85
65
|
version: 1.6.0
|
86
66
|
type: :runtime
|
87
67
|
prerelease: false
|
88
|
-
version_requirements:
|
89
|
-
none: false
|
90
|
-
requirements:
|
91
|
-
- - '='
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: 1.6.0
|
68
|
+
version_requirements: *70363866374520
|
94
69
|
- !ruby/object:Gem::Dependency
|
95
70
|
name: trollop
|
96
|
-
requirement: !ruby/object:Gem::Requirement
|
71
|
+
requirement: &70363866373260 !ruby/object:Gem::Requirement
|
97
72
|
none: false
|
98
73
|
requirements:
|
99
|
-
- -
|
74
|
+
- - =
|
100
75
|
- !ruby/object:Gem::Version
|
101
76
|
version: '2.0'
|
102
77
|
type: :runtime
|
103
78
|
prerelease: false
|
104
|
-
version_requirements:
|
105
|
-
none: false
|
106
|
-
requirements:
|
107
|
-
- - '='
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: '2.0'
|
79
|
+
version_requirements: *70363866373260
|
110
80
|
- !ruby/object:Gem::Dependency
|
111
81
|
name: xml-simple
|
112
|
-
requirement: !ruby/object:Gem::Requirement
|
82
|
+
requirement: &70363866371480 !ruby/object:Gem::Requirement
|
113
83
|
none: false
|
114
84
|
requirements:
|
115
|
-
- -
|
85
|
+
- - =
|
116
86
|
- !ruby/object:Gem::Version
|
117
87
|
version: 1.1.2
|
118
88
|
type: :runtime
|
119
89
|
prerelease: false
|
120
|
-
version_requirements:
|
121
|
-
none: false
|
122
|
-
requirements:
|
123
|
-
- - '='
|
124
|
-
- !ruby/object:Gem::Version
|
125
|
-
version: 1.1.2
|
90
|
+
version_requirements: *70363866371480
|
126
91
|
description: Thats what I do
|
127
92
|
email:
|
128
93
|
- brett@weav.net
|
@@ -150,6 +115,7 @@ files:
|
|
150
115
|
- lib/stackster/config.rb
|
151
116
|
- lib/stackster/entry.rb
|
152
117
|
- lib/stackster/entry/entry_lister.rb
|
118
|
+
- lib/stackster/exceptions.rb
|
153
119
|
- lib/stackster/instance.rb
|
154
120
|
- lib/stackster/instance/instance_reader.rb
|
155
121
|
- lib/stackster/logger.rb
|
@@ -195,7 +161,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
195
161
|
version: '0'
|
196
162
|
segments:
|
197
163
|
- 0
|
198
|
-
hash:
|
164
|
+
hash: 3449585736490155171
|
199
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
200
166
|
none: false
|
201
167
|
requirements:
|
@@ -204,10 +170,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
204
170
|
version: '0'
|
205
171
|
segments:
|
206
172
|
- 0
|
207
|
-
hash:
|
173
|
+
hash: 3449585736490155171
|
208
174
|
requirements: []
|
209
175
|
rubyforge_project: stackster
|
210
|
-
rubygems_version: 1.8.
|
176
|
+
rubygems_version: 1.8.16
|
211
177
|
signing_key:
|
212
178
|
specification_version: 3
|
213
179
|
summary: I make deployments easier
|