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
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ class TestObj
4
+ include SimpleDeploy::AWS::Helpers
5
+ attr_accessor :config
6
+ end
7
+
8
+ describe SimpleDeploy::AWS::Helpers do
9
+
10
+ describe 'connection_args' do
11
+ before do
12
+ @config = stub 'config',
13
+ access_key: 'key',
14
+ secret_key: 'XXX',
15
+ region: 'us-west-1'
16
+ @obj = TestObj.new
17
+
18
+ @args = {
19
+ aws_access_key_id: 'key',
20
+ aws_secret_access_key: 'XXX',
21
+ region: 'us-west-1'
22
+ }
23
+ end
24
+
25
+ describe 'with long lived credentials' do
26
+ before do
27
+ @config.stub temporary_credentials?: false
28
+ @obj.config = @config
29
+ end
30
+
31
+ it 'does not include security token' do
32
+ @obj.connection_args.should eq @args
33
+ end
34
+ end
35
+
36
+ describe 'with temporary credentials' do
37
+ before do
38
+ @config.stub security_token: 'token'
39
+ @config.stub temporary_credentials?: true
40
+ @obj.config = @config
41
+ end
42
+
43
+ it 'includes security security token' do
44
+ args = @args.merge({aws_session_token: 'token'})
45
+ @obj.connection_args.should eq args
46
+ end
47
+ end
48
+
49
+ end
50
+
51
+ end
@@ -2,207 +2,221 @@ require 'spec_helper'
2
2
 
3
3
  describe SimpleDeploy::AWS::InstanceReader do
4
4
  include_context 'double stubbed logger'
5
- include_context 'double stubbed config', :access_key => 'key',
6
- :secret_key => 'XXX',
7
- :region => 'us-west-1'
8
5
 
9
- describe "list_stack_instances" do
10
- before do
11
- @cloud_formation_mock = mock 'cloud formation'
12
- @auto_scaling_groups_mock = mock 'auto scaling'
13
- @ec2_mock = mock 'ec2'
14
-
15
- instances = ['first',{ 'Instances' => [{ 'InstanceId' => 'i-000001' },
16
- { 'InstanceId' => 'i-000002' }] }]
17
- body = { 'DescribeAutoScalingGroupsResult' => { 'AutoScalingGroups' => instances } }
18
- @list_response = stub 'Fog::Response', :body => body, :any? => true
19
-
20
- empty_body = { 'DescribeAutoScalingGroupsResult' => { 'AutoScalingGroups' => [] } }
21
- @empty_response = stub 'Fog::Response', :body => empty_body
22
-
23
- @describe_response = stub 'Excon::Response', :body => {
24
- 'reservationSet' => [{
25
- 'instanceSet' => [{'instanceState' => {'name' => 'running'}},
26
- {'ipAddress' => '54.10.10.1'},
27
- {'instanceId' => 'i-123456'},
28
- {'privateIpAddress' => '192.168.1.1'}]}]
6
+ describe 'temporary credentials' do
7
+ include_context 'double stubbed config', :access_key => 'key',
8
+ :secret_key => 'XXX',
9
+ :security_token => 'the token',
10
+ :temporary_credentials? => true,
11
+ :region => 'us-west-1'
12
+
13
+ it 'creates a connection with the temporary credentials' do
14
+ args = {
15
+ aws_access_key_id: 'key',
16
+ aws_secret_access_key: 'XXX',
17
+ aws_session_token: 'the token',
18
+ region: 'us-west-1'
29
19
  }
30
-
31
- SimpleDeploy::AWS::CloudFormation.stub(:new).
32
- and_return @cloud_formation_mock
20
+ Fog::AWS::AutoScaling.should_receive(:new).with(args)
21
+ Fog::Compute::AWS.should_receive(:new).with(args)
22
+ SimpleDeploy::AWS::InstanceReader.new
33
23
  end
34
24
 
35
- context "with no ASGs" do
36
- before do
37
- @cloud_formation_mock.should_receive(:stack_resources).
38
- exactly(3).times.
39
- with('stack').
40
- and_return []
41
- end
25
+ end
42
26
 
43
- it "should return an empty array" do
44
- instance_reader = SimpleDeploy::AWS::InstanceReader.new
45
- instance_reader.list_stack_instances('stack').should == []
46
- end
27
+ describe 'with long lived credentials' do
28
+ include_context 'double stubbed config', :access_key => 'key',
29
+ :secret_key => 'XXX',
30
+ :security_token => nil,
31
+ :temporary_credentials? => false,
32
+ :region => 'us-west-1'
33
+
34
+ before do
35
+ @auto_scaling_groups_mock = mock 'auto scaling'
36
+ @cloud_formation_mock = mock 'cloud formation'
37
+ @ec2_mock = mock 'ec2'
38
+ Fog::AWS::AutoScaling.stub(:new).and_return @auto_scaling_groups_mock
39
+ Fog::Compute::AWS.stub(:new).and_return @ec2_mock
40
+ SimpleDeploy::AWS::CloudFormation.stub(:new).
41
+ and_return @cloud_formation_mock
47
42
  end
48
43
 
49
- context "with an ASGs" do
44
+ describe "list_stack_instances" do
50
45
  before do
51
- stack_resource_results = []
52
- @asgs = ['asg1', 'asg2'].each do |asg|
53
- stack_resource_results << { 'StackName' => 'stack',
54
- 'ResourceType' => 'AWS::AutoScaling::AutoScalingGroup',
55
- 'PhysicalResourceId' => asg }
56
- end
46
+ instances = ['first',{ 'Instances' => [{ 'InstanceId' => 'i-000001' },
47
+ { 'InstanceId' => 'i-000002' }] }]
48
+ body = { 'DescribeAutoScalingGroupsResult' => { 'AutoScalingGroups' => instances } }
49
+ @list_response = stub 'Fog::Response', :body => body, :any? => true
57
50
 
58
- @cloud_formation_mock.should_receive(:stack_resources).
59
- exactly(3).times.
60
- with('stack').
61
- and_return stack_resource_results
51
+ empty_body = { 'DescribeAutoScalingGroupsResult' => { 'AutoScalingGroups' => [] } }
52
+ @empty_response = stub 'Fog::Response', :body => empty_body
62
53
 
63
- Fog::AWS::AutoScaling.stub(:new).
64
- and_return @auto_scaling_groups_mock
54
+ @describe_response = stub 'Excon::Response', :body => {
55
+ 'reservationSet' => [{
56
+ 'instanceSet' => [{'instanceState' => {'name' => 'running'}},
57
+ {'ipAddress' => '54.10.10.1'},
58
+ {'instanceId' => 'i-123456'},
59
+ {'privateIpAddress' => '192.168.1.1'}]}]
60
+ }
65
61
  end
66
62
 
67
- context "with no running instances" do
68
- it "should return empty array" do
69
- @asgs.each do |asg|
70
- @auto_scaling_groups_mock.should_receive(:describe_auto_scaling_groups).
71
- with('AutoScalingGroupNames' => [asg]).
72
- and_return(@empty_response)
73
- end
63
+ context "with no ASGs" do
64
+ before do
65
+ @cloud_formation_mock.should_receive(:stack_resources).
66
+ exactly(3).times.
67
+ with('stack').
68
+ and_return []
69
+ end
74
70
 
71
+ it "should return an empty array" do
75
72
  instance_reader = SimpleDeploy::AWS::InstanceReader.new
76
73
  instance_reader.list_stack_instances('stack').should == []
77
74
  end
78
75
  end
79
76
 
80
- context "with running instances" do
81
- it "should return the reservation set for each running instance" do
82
- @auto_scaling_groups_mock.should_receive(:describe_auto_scaling_groups).
83
- with('AutoScalingGroupNames' => ['asg1']).
84
- and_return(@list_response)
85
- @auto_scaling_groups_mock.should_receive(:describe_auto_scaling_groups).
86
- with('AutoScalingGroupNames' => ['asg2']).
87
- and_return(@empty_response)
88
-
89
- Fog::Compute::AWS.stub(:new).
90
- and_return @ec2_mock
91
- @ec2_mock.should_receive(:describe_instances).
92
- with('instance-state-name' => 'running',
93
- 'instance-id' => ['i-000001', 'i-000002']).
94
- and_return @describe_response
77
+ context "with an ASGs" do
78
+ before do
79
+ stack_resource_results = []
80
+ @asgs = ['asg1', 'asg2'].each do |asg|
81
+ stack_resource_results << { 'StackName' => 'stack',
82
+ 'ResourceType' => 'AWS::AutoScaling::AutoScalingGroup',
83
+ 'PhysicalResourceId' => asg }
84
+ end
95
85
 
96
- instance_reader = SimpleDeploy::AWS::InstanceReader.new
97
- instance_reader.list_stack_instances('stack').should == [{
98
- 'instanceSet' => [{'instanceState' => {'name' => 'running'}},
99
- {'ipAddress' => '54.10.10.1'},
100
- {'instanceId' => 'i-123456'},
101
- {'privateIpAddress' => '192.168.1.1'}]}]
86
+ @cloud_formation_mock.should_receive(:stack_resources).
87
+ exactly(3).times.
88
+ with('stack').
89
+ and_return stack_resource_results
102
90
  end
103
- end
104
- end
105
91
 
106
- context "with nested stacks and ASGs and EC2 instances" do
107
- before do
108
- stack_resource_results = []
109
- @nested_stacks = ['nested_stack1', 'nested_stack2'].each do |nested_stack|
110
- @cloud_formation_mock.should_receive(:stack_status).
111
- with(nested_stack).
112
- and_return 'CREATE_COMPLETE'
113
- stack_resource_results << { 'StackName' => 'stack',
114
- 'ResourceType' => 'AWS::CloudFormation::Stack',
115
- 'PhysicalResourceId' => nested_stack }
116
- end
117
- @asgs = ['asg1', 'asg2'].each do |asg|
118
- stack_resource_results << { 'StackName' => 'stack',
119
- 'ResourceType' => 'AWS::AutoScaling::AutoScalingGroup',
120
- 'PhysicalResourceId' => asg }
121
- end
92
+ context "with no running instances" do
93
+ it "should return empty array" do
94
+ @asgs.each do |asg|
95
+ @auto_scaling_groups_mock.should_receive(:describe_auto_scaling_groups).
96
+ with('AutoScalingGroupNames' => [asg]).
97
+ and_return(@empty_response)
98
+ end
122
99
 
123
- @instances = ['i-instance1', 'i-instance2'].each do |instance|
124
- stack_resource_results << { 'StackName' => 'stack',
125
- 'ResourceType' => 'AWS::EC2::Instance',
126
- 'PhysicalResourceId' => instance }
100
+ instance_reader = SimpleDeploy::AWS::InstanceReader.new
101
+ instance_reader.list_stack_instances('stack').should == []
102
+ end
127
103
  end
128
104
 
129
- @cloud_formation_mock.should_receive(:stack_resources).
130
- exactly(3).times.
131
- with('stack').
132
- and_return stack_resource_results
133
-
134
- Fog::AWS::AutoScaling.stub(:new).
135
- and_return @auto_scaling_groups_mock
105
+ context "with running instances" do
106
+ it "should return the reservation set for each running instance" do
107
+ @auto_scaling_groups_mock.should_receive(:describe_auto_scaling_groups).
108
+ with('AutoScalingGroupNames' => ['asg1']).
109
+ and_return(@list_response)
110
+ @auto_scaling_groups_mock.should_receive(:describe_auto_scaling_groups).
111
+ with('AutoScalingGroupNames' => ['asg2']).
112
+ and_return(@empty_response)
113
+ @ec2_mock.should_receive(:describe_instances).
114
+ with('instance-state-name' => 'running',
115
+ 'instance-id' => ['i-000001', 'i-000002']).
116
+ and_return @describe_response
117
+
118
+ instance_reader = SimpleDeploy::AWS::InstanceReader.new
119
+ instance_reader.list_stack_instances('stack').should == [{
120
+ 'instanceSet' => [{'instanceState' => {'name' => 'running'}},
121
+ {'ipAddress' => '54.10.10.1'},
122
+ {'instanceId' => 'i-123456'},
123
+ {'privateIpAddress' => '192.168.1.1'}]}]
124
+ end
125
+ end
136
126
  end
137
127
 
138
- context "with running instances in nested stack and ASG and EC2 instances" do
139
- it "should return the reservation set for each running instance" do
140
-
128
+ context "with nested stacks and ASGs and EC2 instances" do
129
+ before do
130
+ stack_resource_results = []
131
+ @nested_stacks = ['nested_stack1', 'nested_stack2'].each do |nested_stack|
132
+ @cloud_formation_mock.should_receive(:stack_status).
133
+ with(nested_stack).
134
+ and_return 'CREATE_COMPLETE'
135
+ stack_resource_results << { 'StackName' => 'stack',
136
+ 'ResourceType' => 'AWS::CloudFormation::Stack',
137
+ 'PhysicalResourceId' => nested_stack }
138
+ end
139
+ @asgs = ['asg1', 'asg2'].each do |asg|
140
+ stack_resource_results << { 'StackName' => 'stack',
141
+ 'ResourceType' => 'AWS::AutoScaling::AutoScalingGroup',
142
+ 'PhysicalResourceId' => asg }
143
+ end
141
144
 
142
- @cloud_formation_mock.should_receive(:stack_resources).
143
- exactly(3).times.
144
- with('nested_stack1').
145
- and_return []
146
-
147
- nested_stack2_resource_results = []
148
- @asgs = ['nested_stack2_asg1', 'nested_stack2_asg2'].each do |nested_stack2_resource_asg|
149
- nested_stack2_resource_results << { 'StackName' => 'nested_stack2',
150
- 'ResourceType' => 'AWS::AutoScaling::AutoScalingGroup',
151
- 'PhysicalResourceId' => nested_stack2_resource_asg }
145
+ @instances = ['i-instance1', 'i-instance2'].each do |instance|
146
+ stack_resource_results << { 'StackName' => 'stack',
147
+ 'ResourceType' => 'AWS::EC2::Instance',
148
+ 'PhysicalResourceId' => instance }
152
149
  end
153
150
 
154
151
  @cloud_formation_mock.should_receive(:stack_resources).
155
- exactly(3).times.
156
- with('nested_stack2').
157
- and_return nested_stack2_resource_results
158
- nested_list_response = stub 'Fog::Response', :body => { 'DescribeAutoScalingGroupsResult' =>
152
+ exactly(3).times.
153
+ with('stack').
154
+ and_return stack_resource_results
155
+ end
156
+
157
+ context "with running instances in nested stack and ASG and EC2 instances" do
158
+ it "should return the reservation set for each running instance" do
159
+ @cloud_formation_mock.should_receive(:stack_resources).
160
+ exactly(3).times.
161
+ with('nested_stack1').
162
+ and_return []
163
+
164
+ nested_stack2_resource_results = []
165
+ @asgs = ['nested_stack2_asg1', 'nested_stack2_asg2'].each do |nested_stack2_resource_asg|
166
+ nested_stack2_resource_results << { 'StackName' => 'nested_stack2',
167
+ 'ResourceType' => 'AWS::AutoScaling::AutoScalingGroup',
168
+ 'PhysicalResourceId' => nested_stack2_resource_asg }
169
+ end
170
+
171
+ @cloud_formation_mock.should_receive(:stack_resources).
172
+ exactly(3).times.
173
+ with('nested_stack2').
174
+ and_return nested_stack2_resource_results
175
+ nested_list_response = stub 'Fog::Response', :body => { 'DescribeAutoScalingGroupsResult' =>
159
176
  { 'AutoScalingGroups' => ['first',
160
- { 'Instances' => [{ 'InstanceId' => 'i-stack001' },
161
- { 'InstanceId' => 'i-stack002' }] }] } },
162
- :any? => true
163
- @auto_scaling_groups_mock.should_receive(:describe_auto_scaling_groups).
164
- with('AutoScalingGroupNames' => ['nested_stack2_asg1']).
165
- and_return(nested_list_response)
166
-
167
- @auto_scaling_groups_mock.should_receive(:describe_auto_scaling_groups).
168
- with('AutoScalingGroupNames' => ['nested_stack2_asg2']).
169
- and_return(@empty_response)
170
-
171
-
172
- @auto_scaling_groups_mock.should_receive(:describe_auto_scaling_groups).
173
- with('AutoScalingGroupNames' => ['asg1']).
174
- and_return(@list_response)
175
- @auto_scaling_groups_mock.should_receive(:describe_auto_scaling_groups).
176
- with('AutoScalingGroupNames' => ['asg2']).
177
- and_return(@empty_response)
178
-
179
- Fog::Compute::AWS.stub(:new).
180
- and_return @ec2_mock
181
-
182
- @ec2_mock.should_receive(:describe_instances).
183
- with('instance-state-name' => 'running',
184
- 'instance-id' => ['i-stack001', 'i-stack002']).
185
- and_return @describe_response
186
-
187
- @ec2_mock.should_receive(:describe_instances).
188
- with('instance-state-name' => 'running',
189
- 'instance-id' => ['i-000001', 'i-000002','i-instance1', 'i-instance2'] ).
190
- and_return @describe_response
177
+ { 'Instances' => [{ 'InstanceId' => 'i-stack001' },
178
+ { 'InstanceId' => 'i-stack002' }] }] } },
179
+ :any? => true
180
+ @auto_scaling_groups_mock.should_receive(:describe_auto_scaling_groups).
181
+ with('AutoScalingGroupNames' => ['nested_stack2_asg1']).
182
+ and_return(nested_list_response)
191
183
 
192
- instance_reader = SimpleDeploy::AWS::InstanceReader.new
193
- instance_reader.list_stack_instances('stack').should == [{
194
- 'instanceSet' => [{'instanceState' => {'name' => 'running'}},
195
- {'ipAddress' => '54.10.10.1'},
196
- {'instanceId' => 'i-123456'},
197
- {'privateIpAddress' => '192.168.1.1'}]},
198
- {
199
- 'instanceSet' => [{'instanceState' => {'name' => 'running'}},
200
- {'ipAddress' => '54.10.10.1'},
201
- {'instanceId' => 'i-123456'},
202
- {'privateIpAddress' => '192.168.1.1'}]}]
184
+ @auto_scaling_groups_mock.should_receive(:describe_auto_scaling_groups).
185
+ with('AutoScalingGroupNames' => ['nested_stack2_asg2']).
186
+ and_return(@empty_response)
187
+
188
+
189
+ @auto_scaling_groups_mock.should_receive(:describe_auto_scaling_groups).
190
+ with('AutoScalingGroupNames' => ['asg1']).
191
+ and_return(@list_response)
192
+ @auto_scaling_groups_mock.should_receive(:describe_auto_scaling_groups).
193
+ with('AutoScalingGroupNames' => ['asg2']).
194
+ and_return(@empty_response)
195
+
196
+ @ec2_mock.should_receive(:describe_instances).
197
+ with('instance-state-name' => 'running',
198
+ 'instance-id' => ['i-stack001', 'i-stack002']).
199
+ and_return @describe_response
200
+
201
+ @ec2_mock.should_receive(:describe_instances).
202
+ with('instance-state-name' => 'running',
203
+ 'instance-id' => ['i-000001', 'i-000002','i-instance1', 'i-instance2'] ).
204
+ and_return @describe_response
205
+
206
+ instance_reader = SimpleDeploy::AWS::InstanceReader.new
207
+ instance_reader.list_stack_instances('stack').should == [{
208
+ 'instanceSet' => [{'instanceState' => {'name' => 'running'}},
209
+ {'ipAddress' => '54.10.10.1'},
210
+ {'instanceId' => 'i-123456'},
211
+ {'privateIpAddress' => '192.168.1.1'}]}, {
212
+ 'instanceSet' => [{'instanceState' => {'name' => 'running'}},
213
+ {'ipAddress' => '54.10.10.1'},
214
+ {'instanceId' => 'i-123456'},
215
+ {'privateIpAddress' => '192.168.1.1'}]}]
216
+ end
203
217
  end
204
218
  end
205
- end
206
219
 
220
+ end
207
221
  end
208
222
  end
@@ -6,92 +6,120 @@ describe SimpleDeploy::AWS::SimpleDB do
6
6
  :region => 'us-west-1'
7
7
 
8
8
  before do
9
- @response_stub = stub 'Excon::Response', :body => {
9
+ @response_stub = stub 'Excon::Response', :body => {
10
10
  'RequestId' => 'rid',
11
11
  'Domains' => ['domain1', 'domain2'],
12
12
  'Items' => { 'item1' => { 'key' => ['value'] } },
13
13
  'NextToken' => nil
14
14
  }
15
- @multi_response_stub = stub 'Excon::Response', :body => {
15
+ @multi_response_stub = stub 'Excon::Response', :body => {
16
16
  'RequestId' => 'rid',
17
17
  'Domains' => ['domain1', 'domain2'],
18
18
  'Items' => { 'item1-2' => { 'key' => ['value'] } },
19
19
  'NextToken' => 'Chunk2'
20
20
  }
21
-
22
- @db_mock = mock 'SimpleDB'
23
- Fog::AWS::SimpleDB.stub(:new).and_return(@db_mock)
24
- @db_mock.stub(:list_domains).and_return(@response_stub)
25
-
26
- @db = SimpleDeploy::AWS::SimpleDB.new
27
21
  end
28
22
 
29
- describe 'domains' do
30
- it 'should return a list of domains' do
31
- @db.domains.should == ['domain1', 'domain2']
23
+ describe 'temporary credentials' do
24
+ include_context 'double stubbed config', :access_key => 'key',
25
+ :secret_key => 'XXX',
26
+ :security_token => 'the token',
27
+ :temporary_credentials? => true,
28
+ :region => 'us-west-1'
29
+
30
+ it 'creates a connection with the temporary credentials' do
31
+ args = {
32
+ aws_access_key_id: 'key',
33
+ aws_secret_access_key: 'XXX',
34
+ aws_session_token: 'the token',
35
+ region: 'us-west-1'
36
+ }
37
+ Fog::AWS::SimpleDB.should_receive(:new).with(args)
38
+ SimpleDeploy::AWS::SimpleDB.new
32
39
  end
33
40
  end
34
41
 
35
- describe 'domain_exists?' do
36
- it 'should return true for existing domains' do
37
- @db.domain_exists?('domain1').should be_true
42
+ describe 'with long lived credentials' do
43
+ include_context 'double stubbed config', :access_key => 'key',
44
+ :secret_key => 'XXX',
45
+ :security_token => nil,
46
+ :temporary_credentials? => false,
47
+ :region => 'us-west-1'
48
+ before do
49
+ @db_mock = mock 'SimpleDB'
50
+ Fog::AWS::SimpleDB.stub(:new).and_return(@db_mock)
51
+ @db_mock.stub(:list_domains).and_return(@response_stub)
52
+
53
+ @db = SimpleDeploy::AWS::SimpleDB.new
38
54
  end
39
55
 
40
- it 'should return false for non-existent domains' do
41
- @db.domain_exists?('baddomain1').should_not be_true
56
+ describe 'domains' do
57
+ it 'should return a list of domains' do
58
+ @db.domains.should == ['domain1', 'domain2']
59
+ end
42
60
  end
43
- end
44
61
 
45
- describe 'create_domain' do
46
- it 'should create a new domain' do
47
- @db_mock.should_receive(:create_domain).with('newdomain').and_return(@response_stub)
62
+ describe 'domain_exists?' do
63
+ it 'should return true for existing domains' do
64
+ @db.domain_exists?('domain1').should be_true
65
+ end
48
66
 
49
- @db.create_domain('newdomain').body['RequestId'].should == 'rid'
67
+ it 'should return false for non-existent domains' do
68
+ @db.domain_exists?('baddomain1').should_not be_true
69
+ end
50
70
  end
51
71
 
52
- it 'should not create a duplicate domain' do
53
- @db_mock.should_not_receive(:create_domain)
72
+ describe 'create_domain' do
73
+ it 'should create a new domain' do
74
+ @db_mock.should_receive(:create_domain).with('newdomain').and_return(@response_stub)
54
75
 
55
- @db.create_domain('domain1').should be_nil
56
- end
57
- end
76
+ @db.create_domain('newdomain').body['RequestId'].should == 'rid'
77
+ end
58
78
 
59
- describe 'put_attributes' do
60
- it 'should update the specified domain' do
61
- @db_mock.should_receive(:put_attributes).with('domain1', 'item1', { 'key' => 'value' }, {}).and_return(@response_stub)
79
+ it 'should not create a duplicate domain' do
80
+ @db_mock.should_not_receive(:create_domain)
62
81
 
63
- @db.put_attributes('domain1', 'item1', { 'key' => 'value' }, {}).body['RequestId'].should == 'rid'
82
+ @db.create_domain('domain1').should be_nil
83
+ end
64
84
  end
65
- end
66
85
 
67
- describe 'select' do
68
- it 'should return query items' do
69
- @db_mock.should_receive(:select).with('item1', { "ConsistentRead" => true, "NextToken" => nil } ).and_return(@response_stub)
86
+ describe 'put_attributes' do
87
+ it 'should update the specified domain' do
88
+ @db_mock.should_receive(:put_attributes).with('domain1', 'item1', { 'key' => 'value' }, {}).and_return(@response_stub)
70
89
 
71
- @db.select('item1').should == { 'item1' => { 'key' => ['value'] } }
90
+ @db.put_attributes('domain1', 'item1', { 'key' => 'value' }, {}).body['RequestId'].should == 'rid'
91
+ end
72
92
  end
73
93
 
74
- it 'should return multiple chunks of query items' do
75
- @db_mock.should_receive(:select).with('item1', { "ConsistentRead" => true, "NextToken" => nil } ).and_return(@multi_response_stub)
76
- @db_mock.should_receive(:select).with('item1', { "ConsistentRead" => true, "NextToken" => 'Chunk2' } ).and_return(@response_stub)
94
+ describe 'select' do
95
+ it 'should return query items' do
96
+ @db_mock.should_receive(:select).with('item1', { "ConsistentRead" => true, "NextToken" => nil } ).and_return(@response_stub)
97
+
98
+ @db.select('item1').should == { 'item1' => { 'key' => ['value'] } }
99
+ end
100
+
101
+ it 'should return multiple chunks of query items' do
102
+ @db_mock.should_receive(:select).with('item1', { "ConsistentRead" => true, "NextToken" => nil } ).and_return(@multi_response_stub)
103
+ @db_mock.should_receive(:select).with('item1', { "ConsistentRead" => true, "NextToken" => 'Chunk2' } ).and_return(@response_stub)
77
104
 
78
- @db.select('item1').should == { 'item1' => { 'key' => ['value'] }, 'item1-2' => { 'key' => ['value'] } }
105
+ @db.select('item1').should == { 'item1' => { 'key' => ['value'] }, 'item1-2' => { 'key' => ['value'] } }
106
+ end
79
107
  end
80
- end
81
108
 
82
- describe 'delete' do
83
- it 'should delete the attributes identified by domain and key' do
84
- @db_mock.should_receive(:delete_attributes).with('domain1', 'item1').and_return(@response_stub)
109
+ describe 'delete' do
110
+ it 'should delete the attributes identified by domain and key' do
111
+ @db_mock.should_receive(:delete_attributes).with('domain1', 'item1').and_return(@response_stub)
85
112
 
86
- @db.delete('domain1', 'item1').body['RequestId'].should == 'rid'
113
+ @db.delete('domain1', 'item1').body['RequestId'].should == 'rid'
114
+ end
87
115
  end
88
- end
89
-
90
- describe 'delete_items' do
91
- it 'should delete the specific attributes passed associated with domain and key' do
92
- @db_mock.should_receive(:delete_attributes).with('domain1', 'item1', {'value'=>nil}).and_return(@response_stub)
93
116
 
94
- @db.delete_items('domain1', 'item1', {'value'=>nil}).body['RequestId'].should == 'rid'
117
+ describe 'delete_items' do
118
+ it 'should delete the specific attributes passed associated with domain and key' do
119
+ @db_mock.should_receive(:delete_attributes).with('domain1', 'item1', {'value'=>nil}).and_return(@response_stub)
120
+
121
+ @db.delete_items('domain1', 'item1', {'value'=>nil}).body['RequestId'].should == 'rid'
122
+ end
95
123
  end
96
124
  end
97
125
  end