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