knife-ec2 0.11.0.rc.0 → 0.11.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.
- checksums.yaml +4 -4
- data/.gitignore +4 -0
- data/.travis.yml +5 -1
- data/CHANGELOG.md +3 -2
- data/DOC_CHANGES.md +17 -4
- data/README.md +30 -15
- data/RELEASE_NOTES.md +1 -1
- data/Rakefile +6 -7
- data/knife-ec2.gemspec +8 -10
- data/lib/chef/knife/ec2_base.rb +6 -0
- data/lib/chef/knife/ec2_server_create.rb +162 -28
- data/lib/chef/knife/ec2_server_delete.rb +17 -16
- data/lib/chef/knife/s3_source.rb +12 -2
- data/lib/knife-ec2/version.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/unit/ec2_server_create_spec.rb +437 -235
- data/spec/unit/ec2_server_delete_spec.rb +45 -43
- data/spec/unit/s3_source_spec.rb +40 -18
- metadata +16 -29
@@ -74,22 +74,23 @@ class Chef
|
|
74
74
|
begin
|
75
75
|
@server = connection.servers.get(instance_id)
|
76
76
|
|
77
|
-
msg_pair(
|
78
|
-
msg_pair(
|
79
|
-
msg_pair(
|
80
|
-
msg_pair(
|
81
|
-
msg_pair(
|
82
|
-
msg_pair(
|
83
|
-
msg_pair(
|
84
|
-
msg_pair(
|
85
|
-
msg_pair(
|
86
|
-
msg_pair(
|
87
|
-
msg_pair(
|
88
|
-
msg_pair(
|
89
|
-
msg_pair(
|
90
|
-
|
91
|
-
|
92
|
-
|
77
|
+
msg_pair('Instance ID', @server.id)
|
78
|
+
msg_pair('Instance Name', @server.tags['Name'])
|
79
|
+
msg_pair('Flavor', @server.flavor_id)
|
80
|
+
msg_pair('Image', @server.image_id)
|
81
|
+
msg_pair('Region', connection.instance_variable_get(:@region))
|
82
|
+
msg_pair('Availability Zone', @server.availability_zone)
|
83
|
+
msg_pair('Security Groups', @server.groups.join(', '))
|
84
|
+
msg_pair('IAM Profile', iam_name_from_profile(@server.iam_instance_profile)) if @server.iam_instance_profile
|
85
|
+
msg_pair('SSH Key', @server.key_name)
|
86
|
+
msg_pair('Root Device Type', @server.root_device_type)
|
87
|
+
msg_pair('Public DNS Name', @server.dns_name)
|
88
|
+
msg_pair('Public IP Address', @server.public_ip_address)
|
89
|
+
msg_pair('Private DNS Name', @server.private_dns_name)
|
90
|
+
msg_pair('Private IP Address', @server.private_ip_address)
|
91
|
+
|
92
|
+
puts '\n'
|
93
|
+
confirm('Do you really want to delete this server')
|
93
94
|
|
94
95
|
@server.destroy
|
95
96
|
|
data/lib/chef/knife/s3_source.rb
CHANGED
@@ -20,11 +20,21 @@ class Chef
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def bucket
|
23
|
-
URI(@url)
|
23
|
+
uri = URI(@url)
|
24
|
+
if uri.scheme == "s3"
|
25
|
+
URI(@url).host
|
26
|
+
else
|
27
|
+
URI(@url).path.split("/")[1]
|
28
|
+
end
|
24
29
|
end
|
25
30
|
|
26
31
|
def path
|
27
|
-
URI(@url)
|
32
|
+
uri = URI(@url)
|
33
|
+
if uri.scheme == "s3"
|
34
|
+
URI(@url).path.sub(/^\//, '')
|
35
|
+
else
|
36
|
+
URI(@url).path.split(bucket).last.sub(/^\//, '')
|
37
|
+
end
|
28
38
|
end
|
29
39
|
|
30
40
|
def fog
|
data/lib/knife-ec2/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -8,6 +8,7 @@ require 'chef/knife/ec2_server_list'
|
|
8
8
|
# Clear config between each example
|
9
9
|
# to avoid dependencies between examples
|
10
10
|
RSpec.configure do |c|
|
11
|
+
c.raise_errors_for_deprecations!
|
11
12
|
c.filter_run_excluding :exclude => true
|
12
13
|
c.before(:each) do
|
13
14
|
Chef::Config.reset
|
@@ -29,11 +29,11 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
29
29
|
before(:each) do
|
30
30
|
@knife_ec2_create = Chef::Knife::Ec2ServerCreate.new
|
31
31
|
@knife_ec2_create.initial_sleep_delay = 0
|
32
|
-
@knife_ec2_create.
|
32
|
+
allow(@knife_ec2_create).to receive(:tcp_test_ssh).and_return(true)
|
33
33
|
|
34
34
|
{
|
35
35
|
:image => 'image',
|
36
|
-
:
|
36
|
+
:ssh_key_name => 'ssh_key_name',
|
37
37
|
:aws_access_key_id => 'aws_access_key_id',
|
38
38
|
:aws_secret_access_key => 'aws_secret_access_key'
|
39
39
|
}.each do |key, value|
|
@@ -41,9 +41,9 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
41
41
|
end
|
42
42
|
|
43
43
|
@ec2_connection = double(Fog::Compute::AWS)
|
44
|
-
@ec2_connection.
|
45
|
-
@ec2_connection.
|
46
|
-
@ec2_connection.
|
44
|
+
allow(@ec2_connection).to receive(:tags).and_return double('create', :create => true)
|
45
|
+
allow(@ec2_connection).to receive_message_chain(:images, :get).and_return double('ami', :root_device_type => 'not_ebs', :platform => 'linux')
|
46
|
+
allow(@ec2_connection).to receive(:addresses).and_return [double('addesses', {
|
47
47
|
:domain => 'standard',
|
48
48
|
:public_ip => '111.111.111.111',
|
49
49
|
:server_id => nil,
|
@@ -52,6 +52,8 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
52
52
|
|
53
53
|
@ec2_servers = double()
|
54
54
|
@new_ec2_server = double()
|
55
|
+
@spot_requests = double
|
56
|
+
@new_spot_request = double
|
55
57
|
|
56
58
|
@ec2_server_attribs = { :id => 'i-39382318',
|
57
59
|
:flavor_id => 'm1.small',
|
@@ -67,47 +69,128 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
67
69
|
:private_ip_address => '10.251.75.20',
|
68
70
|
:root_device_type => 'not_ebs' }
|
69
71
|
|
72
|
+
@spot_request_attribs = { :id => 'test_spot_request_id',
|
73
|
+
:price => 0.001,
|
74
|
+
:request_type => 'persistent',
|
75
|
+
:created_at => '2015-07-14 09:53:11 UTC',
|
76
|
+
:instance_count => nil,
|
77
|
+
:instance_id => 'test_spot_instance_id',
|
78
|
+
:state => 'open',
|
79
|
+
:key_name => 'ssh_key_name',
|
80
|
+
:availability_zone => nil,
|
81
|
+
:flavor_id => 'm1.small',
|
82
|
+
:image_id => 'image' }
|
83
|
+
|
84
|
+
|
70
85
|
@ec2_server_attribs.each_pair do |attrib, value|
|
71
|
-
@new_ec2_server.
|
86
|
+
allow(@new_ec2_server).to receive(attrib).and_return(value)
|
87
|
+
end
|
88
|
+
|
89
|
+
@spot_request_attribs.each_pair do |attrib, value|
|
90
|
+
allow(@new_spot_request).to receive(attrib).and_return(value)
|
72
91
|
end
|
73
92
|
|
74
93
|
@s3_connection = double(Fog::Storage::AWS)
|
75
94
|
|
76
95
|
@bootstrap = Chef::Knife::Bootstrap.new
|
77
|
-
Chef::Knife::Bootstrap.
|
96
|
+
allow(Chef::Knife::Bootstrap).to receive(:new).and_return(@bootstrap)
|
78
97
|
|
79
98
|
@validation_key_url = 's3://bucket/foo/bar'
|
80
99
|
@validation_key_file = '/tmp/a_good_temp_file'
|
81
100
|
@validation_key_body = "TEST VALIDATION KEY\n"
|
82
101
|
end
|
83
102
|
|
103
|
+
describe "Spot Instance creation" do
|
104
|
+
before do
|
105
|
+
allow(Fog::Compute::AWS).to receive(:new).and_return(@ec2_connection)
|
106
|
+
@knife_ec2_create.config[:spot_price] = 0.001
|
107
|
+
@knife_ec2_create.config[:spot_request_type] = 'persistent'
|
108
|
+
allow(@knife_ec2_create).to receive(:puts)
|
109
|
+
allow(@knife_ec2_create).to receive(:msg_pair)
|
110
|
+
allow(@knife_ec2_create.ui).to receive(:color).and_return('')
|
111
|
+
allow(@knife_ec2_create).to receive(:confirm)
|
112
|
+
@spot_instance_server_def = {
|
113
|
+
:image_id => "image",
|
114
|
+
:groups => nil,
|
115
|
+
:security_group_ids => nil,
|
116
|
+
:flavor_id => nil,
|
117
|
+
:key_name => "ssh_key_name",
|
118
|
+
:availability_zone => nil,
|
119
|
+
:price => 0.001,
|
120
|
+
:request_type => 'persistent',
|
121
|
+
:placement_group => nil,
|
122
|
+
:iam_instance_profile_name => nil,
|
123
|
+
:ebs_optimized => "false"
|
124
|
+
}
|
125
|
+
allow(@bootstrap).to receive(:run)
|
126
|
+
end
|
127
|
+
|
128
|
+
it "creates a new spot instance request with request type as persistent" do
|
129
|
+
expect(@ec2_connection).to receive(
|
130
|
+
:spot_requests).and_return(@spot_requests)
|
131
|
+
expect(@spot_requests).to receive(
|
132
|
+
:create).with(@spot_instance_server_def).and_return(@new_spot_request)
|
133
|
+
@knife_ec2_create.config[:yes] = true
|
134
|
+
allow(@new_spot_request).to receive(:wait_for).and_return(true)
|
135
|
+
allow(@ec2_connection).to receive(:servers).and_return(@ec2_servers)
|
136
|
+
allow(@ec2_servers).to receive(
|
137
|
+
:get).with(@new_spot_request.instance_id).and_return(@new_ec2_server)
|
138
|
+
allow(@new_ec2_server).to receive(:wait_for).and_return(true)
|
139
|
+
@knife_ec2_create.run
|
140
|
+
expect(@new_spot_request.request_type).to eq('persistent')
|
141
|
+
end
|
142
|
+
|
143
|
+
it "successfully creates a new spot instance" do
|
144
|
+
allow(@ec2_connection).to receive(
|
145
|
+
:spot_requests).and_return(@spot_requests)
|
146
|
+
allow(@spot_requests).to receive(
|
147
|
+
:create).with(@spot_instance_server_def).and_return(@new_spot_request)
|
148
|
+
@knife_ec2_create.config[:yes] = true
|
149
|
+
expect(@new_spot_request).to receive(:wait_for).and_return(true)
|
150
|
+
expect(@ec2_connection).to receive(:servers).and_return(@ec2_servers)
|
151
|
+
expect(@ec2_servers).to receive(
|
152
|
+
:get).with(@new_spot_request.instance_id).and_return(@new_ec2_server)
|
153
|
+
expect(@new_ec2_server).to receive(:wait_for).and_return(true)
|
154
|
+
@knife_ec2_create.run
|
155
|
+
end
|
156
|
+
|
157
|
+
it "does not create the spot instance request and creates a regular instance" do
|
158
|
+
@knife_ec2_create.config.delete(:spot_price)
|
159
|
+
expect(@ec2_connection).to receive(:servers).and_return(@ec2_servers)
|
160
|
+
expect(@ec2_servers).to receive(
|
161
|
+
:create).and_return(@new_ec2_server)
|
162
|
+
expect(@new_ec2_server).to receive(:wait_for).and_return(true)
|
163
|
+
@knife_ec2_create.run
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
84
167
|
describe "run" do
|
85
168
|
before do
|
86
|
-
@ec2_servers.
|
87
|
-
@ec2_connection.
|
88
|
-
@ec2_connection.
|
169
|
+
expect(@ec2_servers).to receive(:create).and_return(@new_ec2_server)
|
170
|
+
expect(@ec2_connection).to receive(:servers).and_return(@ec2_servers)
|
171
|
+
expect(@ec2_connection).to receive(:addresses)
|
89
172
|
|
90
173
|
@eip = "111.111.111.111"
|
91
|
-
Fog::Compute::AWS.
|
174
|
+
expect(Fog::Compute::AWS).to receive(:new).and_return(@ec2_connection)
|
92
175
|
|
93
|
-
@knife_ec2_create.
|
94
|
-
@knife_ec2_create.
|
176
|
+
allow(@knife_ec2_create).to receive(:puts)
|
177
|
+
allow(@knife_ec2_create).to receive(:print)
|
95
178
|
@knife_ec2_create.config[:image] = '12345'
|
96
|
-
@bootstrap.
|
179
|
+
expect(@bootstrap).to receive(:run)
|
97
180
|
end
|
98
181
|
|
99
182
|
it "defaults to a distro of 'chef-full' for a linux instance" do
|
100
|
-
@new_ec2_server.
|
183
|
+
expect(@new_ec2_server).to receive(:wait_for).and_return(true)
|
101
184
|
@knife_ec2_create.config[:distro] = @knife_ec2_create.options[:distro][:default]
|
185
|
+
expect(@knife_ec2_create).to receive(:default_bootstrap_template).and_return('chef-full')
|
102
186
|
@knife_ec2_create.run
|
103
|
-
@bootstrap.config[:distro].should == 'chef-full'
|
104
187
|
end
|
105
188
|
|
106
189
|
it "creates an EC2 instance and bootstraps it" do
|
107
|
-
@new_ec2_server.
|
108
|
-
@knife_ec2_create.
|
190
|
+
expect(@new_ec2_server).to receive(:wait_for).and_return(true)
|
191
|
+
expect(@knife_ec2_create).to receive(:ssh_override_winrm)
|
109
192
|
@knife_ec2_create.run
|
110
|
-
@knife_ec2_create.server.
|
193
|
+
expect(@knife_ec2_create.server).to_not be_nil
|
111
194
|
end
|
112
195
|
|
113
196
|
it "set ssh_user value by using -x option for ssh bootstrap protocol or linux image" do
|
@@ -116,10 +199,10 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
116
199
|
@knife_ec2_create.config[:winrm_user] = "ubuntu"
|
117
200
|
@knife_ec2_create.config[:ssh_user] = "root"
|
118
201
|
|
119
|
-
@new_ec2_server.
|
202
|
+
expect(@new_ec2_server).to receive(:wait_for).and_return(true)
|
120
203
|
@knife_ec2_create.run
|
121
|
-
@knife_ec2_create.config[:ssh_user].
|
122
|
-
@knife_ec2_create.server.
|
204
|
+
expect(@knife_ec2_create.config[:ssh_user]).to eq("ubuntu")
|
205
|
+
expect(@knife_ec2_create.server).to_not be_nil
|
123
206
|
end
|
124
207
|
|
125
208
|
it "set ssh_password value by using -P option for ssh bootstrap protocol or linux image" do
|
@@ -128,10 +211,10 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
128
211
|
@knife_ec2_create.config[:winrm_password] = "winrm_password"
|
129
212
|
@knife_ec2_create.config[:ssh_password] = nil
|
130
213
|
|
131
|
-
@new_ec2_server.
|
214
|
+
expect(@new_ec2_server).to receive(:wait_for).and_return(true)
|
132
215
|
@knife_ec2_create.run
|
133
|
-
@knife_ec2_create.config[:ssh_password].
|
134
|
-
@knife_ec2_create.server.
|
216
|
+
expect(@knife_ec2_create.config[:ssh_password]).to eq("winrm_password")
|
217
|
+
expect(@knife_ec2_create.server).to_not be_nil
|
135
218
|
end
|
136
219
|
|
137
220
|
it "set ssh_port value by using -p option for ssh bootstrap protocol or linux image" do
|
@@ -140,10 +223,10 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
140
223
|
@knife_ec2_create.config[:winrm_port] = "1234"
|
141
224
|
@knife_ec2_create.config[:ssh_port] = "22"
|
142
225
|
|
143
|
-
@new_ec2_server.
|
226
|
+
expect(@new_ec2_server).to receive(:wait_for).and_return(true)
|
144
227
|
@knife_ec2_create.run
|
145
|
-
@knife_ec2_create.config[:ssh_port].
|
146
|
-
@knife_ec2_create.server.
|
228
|
+
expect(@knife_ec2_create.config[:ssh_port]).to eq("1234")
|
229
|
+
expect(@knife_ec2_create.server).to_not be_nil
|
147
230
|
end
|
148
231
|
|
149
232
|
it "set identity_file value by using -i option for ssh bootstrap protocol or linux image" do
|
@@ -152,97 +235,98 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
152
235
|
@knife_ec2_create.config[:kerberos_keytab_file] = "kerberos_keytab_file"
|
153
236
|
@knife_ec2_create.config[:identity_file] = nil
|
154
237
|
|
155
|
-
@new_ec2_server.
|
238
|
+
expect(@new_ec2_server).to receive(:wait_for).and_return(true)
|
156
239
|
@knife_ec2_create.run
|
157
|
-
@knife_ec2_create.config[:identity_file].
|
158
|
-
@knife_ec2_create.server.
|
240
|
+
expect(@knife_ec2_create.config[:identity_file]).to eq("kerberos_keytab_file")
|
241
|
+
expect(@knife_ec2_create.server).to_not be_nil
|
159
242
|
end
|
160
243
|
|
161
244
|
it "should never invoke windows bootstrap for linux instance" do
|
162
|
-
@new_ec2_server.
|
163
|
-
@knife_ec2_create.
|
245
|
+
expect(@new_ec2_server).to receive(:wait_for).and_return(true)
|
246
|
+
expect(@knife_ec2_create).not_to receive(:bootstrap_for_windows_node)
|
164
247
|
@knife_ec2_create.run
|
165
248
|
end
|
166
249
|
|
167
250
|
it "creates an EC2 instance, assigns existing EIP and bootstraps it" do
|
168
251
|
@knife_ec2_create.config[:associate_eip] = @eip
|
169
252
|
|
170
|
-
@new_ec2_server.
|
171
|
-
@ec2_connection.
|
172
|
-
@new_ec2_server.
|
253
|
+
allow(@new_ec2_server).to receive(:public_ip_address).and_return(@eip)
|
254
|
+
expect(@ec2_connection).to receive(:associate_address).with(@ec2_server_attribs[:id], @eip, nil, '')
|
255
|
+
expect(@new_ec2_server).to receive(:wait_for).at_least(:twice).and_return(true)
|
173
256
|
|
174
257
|
@knife_ec2_create.run
|
175
|
-
@knife_ec2_create.server.
|
258
|
+
expect(@knife_ec2_create.server).to_not be_nil
|
176
259
|
end
|
177
260
|
|
178
261
|
it "retries if it receives Fog::Compute::AWS::NotFound" do
|
179
|
-
@new_ec2_server.
|
180
|
-
@knife_ec2_create.
|
181
|
-
@knife_ec2_create.
|
182
|
-
@knife_ec2_create.
|
183
|
-
@knife_ec2_create.ui.
|
262
|
+
expect(@new_ec2_server).to receive(:wait_for).and_return(true)
|
263
|
+
expect(@knife_ec2_create).to receive(:create_tags).and_raise(Fog::Compute::AWS::NotFound)
|
264
|
+
expect(@knife_ec2_create).to receive(:create_tags).and_return(true)
|
265
|
+
expect(@knife_ec2_create).to receive(:sleep).and_return(true)
|
266
|
+
expect(@knife_ec2_create.ui).to receive(:warn).with(/retrying/)
|
184
267
|
@knife_ec2_create.run
|
185
268
|
end
|
186
269
|
|
187
270
|
it 'actually writes to the validation key tempfile' do
|
188
|
-
@new_ec2_server.
|
271
|
+
expect(@new_ec2_server).to receive(:wait_for).and_return(true)
|
189
272
|
Chef::Config[:knife][:validation_key_url] =
|
190
273
|
@validation_key_url
|
191
274
|
@knife_ec2_create.config[:validation_key_url] =
|
192
275
|
@validation_key_url
|
193
276
|
|
194
|
-
@knife_ec2_create.
|
195
|
-
Chef::Knife::S3Source.
|
196
|
-
File.
|
277
|
+
allow(@knife_ec2_create).to receive_message_chain(:validation_key_tmpfile, :path).and_return(@validation_key_file)
|
278
|
+
allow(Chef::Knife::S3Source).to receive(:fetch).with(@validation_key_url).and_return(@validation_key_body)
|
279
|
+
expect(File).to receive(:open).with(@validation_key_file, 'w')
|
197
280
|
@knife_ec2_create.run
|
198
281
|
end
|
199
282
|
end
|
200
283
|
|
201
284
|
describe "run for EC2 Windows instance" do
|
202
285
|
before do
|
203
|
-
@ec2_servers.
|
204
|
-
@ec2_connection.
|
205
|
-
@ec2_connection.
|
286
|
+
expect(@ec2_servers).to receive(:create).and_return(@new_ec2_server)
|
287
|
+
expect(@ec2_connection).to receive(:servers).and_return(@ec2_servers)
|
288
|
+
expect(@ec2_connection).to receive(:addresses)
|
206
289
|
|
207
|
-
Fog::Compute::AWS.
|
290
|
+
expect(Fog::Compute::AWS).to receive(:new).and_return(@ec2_connection)
|
208
291
|
|
209
|
-
@knife_ec2_create.
|
210
|
-
@knife_ec2_create.
|
292
|
+
allow(@knife_ec2_create).to receive(:puts)
|
293
|
+
allow(@knife_ec2_create).to receive(:print)
|
211
294
|
@knife_ec2_create.config[:identity_file] = "~/.ssh/aws-key.pem"
|
212
295
|
@knife_ec2_create.config[:image] = '12345'
|
213
|
-
@knife_ec2_create.
|
214
|
-
@knife_ec2_create.
|
296
|
+
allow(@knife_ec2_create).to receive(:is_image_windows?).and_return(true)
|
297
|
+
allow(@knife_ec2_create).to receive(:tcp_test_winrm).and_return(true)
|
215
298
|
end
|
216
299
|
|
217
300
|
it "bootstraps via the WinRM protocol" do
|
218
301
|
@knife_ec2_create.config[:winrm_password] = 'winrm-password'
|
219
302
|
@knife_ec2_create.config[:bootstrap_protocol] = 'winrm'
|
220
303
|
@bootstrap_winrm = Chef::Knife::BootstrapWindowsWinrm.new
|
221
|
-
Chef::Knife::BootstrapWindowsWinrm.
|
222
|
-
@bootstrap_winrm.
|
223
|
-
@knife_ec2_create.
|
224
|
-
@new_ec2_server.
|
304
|
+
allow(Chef::Knife::BootstrapWindowsWinrm).to receive(:new).and_return(@bootstrap_winrm)
|
305
|
+
expect(@bootstrap_winrm).to receive(:run)
|
306
|
+
expect(@knife_ec2_create).not_to receive(:ssh_override_winrm)
|
307
|
+
expect(@new_ec2_server).to receive(:wait_for).and_return(true)
|
225
308
|
@knife_ec2_create.run
|
226
309
|
end
|
227
310
|
|
228
311
|
it "set default distro to windows-chef-client-msi for windows" do
|
229
312
|
@knife_ec2_create.config[:winrm_password] = 'winrm-password'
|
230
|
-
@knife_ec2_create.config[:bootstrap_protocol] = 'winrm'
|
313
|
+
@knife_ec2_create.config[:bootstrap_protocol] = 'winrm'
|
231
314
|
@bootstrap_winrm = Chef::Knife::BootstrapWindowsWinrm.new
|
232
|
-
Chef::Knife::BootstrapWindowsWinrm.
|
233
|
-
@bootstrap_winrm.
|
234
|
-
@new_ec2_server.
|
315
|
+
allow(Chef::Knife::BootstrapWindowsWinrm).to receive(:new).and_return(@bootstrap_winrm)
|
316
|
+
expect(@bootstrap_winrm).to receive(:run)
|
317
|
+
expect(@new_ec2_server).to receive(:wait_for).and_return(true)
|
318
|
+
allow(@knife_ec2_create).to receive(:is_image_windows?).and_return(true)
|
319
|
+
expect(@knife_ec2_create).to receive(:default_bootstrap_template).and_return("windows-chef-client-msi")
|
235
320
|
@knife_ec2_create.run
|
236
|
-
@knife_ec2_create.config[:distro].should == "windows-chef-client-msi"
|
237
321
|
end
|
238
322
|
|
239
323
|
it "bootstraps via the SSH protocol" do
|
240
324
|
@knife_ec2_create.config[:bootstrap_protocol] = 'ssh'
|
241
325
|
bootstrap_win_ssh = Chef::Knife::BootstrapWindowsSsh.new
|
242
|
-
Chef::Knife::BootstrapWindowsSsh.
|
243
|
-
bootstrap_win_ssh.
|
244
|
-
@knife_ec2_create.
|
245
|
-
@new_ec2_server.
|
326
|
+
allow(Chef::Knife::BootstrapWindowsSsh).to receive(:new).and_return(bootstrap_win_ssh)
|
327
|
+
expect(bootstrap_win_ssh).to receive(:run)
|
328
|
+
expect(@knife_ec2_create).to receive(:ssh_override_winrm)
|
329
|
+
expect(@new_ec2_server).to receive(:wait_for).and_return(true)
|
246
330
|
@knife_ec2_create.run
|
247
331
|
end
|
248
332
|
|
@@ -250,51 +334,51 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
250
334
|
@knife_ec2_create.config[:bootstrap_protocol] = 'ssh'
|
251
335
|
@knife_ec2_create.config[:ssh_port] = 422
|
252
336
|
|
253
|
-
@knife_ec2_create.
|
337
|
+
expect(@knife_ec2_create).to receive(:tcp_test_ssh).with('ec2-75.101.253.10.compute-1.amazonaws.com', 422).and_return(true)
|
254
338
|
|
255
339
|
bootstrap_win_ssh = Chef::Knife::BootstrapWindowsSsh.new
|
256
|
-
Chef::Knife::BootstrapWindowsSsh.
|
257
|
-
bootstrap_win_ssh.
|
258
|
-
@new_ec2_server.
|
340
|
+
allow(Chef::Knife::BootstrapWindowsSsh).to receive(:new).and_return(bootstrap_win_ssh)
|
341
|
+
expect(bootstrap_win_ssh).to receive(:run)
|
342
|
+
expect(@new_ec2_server).to receive(:wait_for).and_return(true)
|
259
343
|
@knife_ec2_create.run
|
260
344
|
end
|
261
345
|
|
262
346
|
it "should never invoke linux bootstrap" do
|
263
347
|
@knife_ec2_create.config[:bootstrap_protocol] = 'winrm'
|
264
|
-
@knife_ec2_create.
|
265
|
-
@knife_ec2_create.
|
266
|
-
@new_ec2_server.
|
267
|
-
@knife_ec2_create.
|
348
|
+
allow(@knife_ec2_create).to receive(:windows_password).and_return("")
|
349
|
+
expect(@knife_ec2_create).not_to receive(:bootstrap_for_linux_node)
|
350
|
+
expect(@new_ec2_server).to receive(:wait_for).and_return(true)
|
351
|
+
allow(@knife_ec2_create).to receive(:bootstrap_for_windows_node).and_return double("bootstrap", :run => true)
|
268
352
|
@knife_ec2_create.run
|
269
353
|
end
|
270
354
|
|
271
355
|
it "waits for EC2 to generate password if not supplied" do
|
272
356
|
@knife_ec2_create.config[:bootstrap_protocol] = 'winrm'
|
273
357
|
@knife_ec2_create.config[:winrm_password] = nil
|
274
|
-
@knife_ec2_create.
|
275
|
-
@new_ec2_server.
|
276
|
-
@knife_ec2_create.
|
358
|
+
expect(@knife_ec2_create).to receive(:windows_password).and_return("")
|
359
|
+
allow(@new_ec2_server).to receive(:wait_for).and_return(true)
|
360
|
+
allow(@knife_ec2_create).to receive(:check_windows_password_available).and_return(true)
|
277
361
|
bootstrap_winrm = Chef::Knife::BootstrapWindowsWinrm.new
|
278
|
-
Chef::Knife::BootstrapWindowsWinrm.
|
279
|
-
bootstrap_winrm.
|
362
|
+
allow(Chef::Knife::BootstrapWindowsWinrm).to receive(:new).and_return(bootstrap_winrm)
|
363
|
+
expect(bootstrap_winrm).to receive(:run)
|
280
364
|
@knife_ec2_create.run
|
281
365
|
end
|
282
366
|
end
|
283
367
|
|
284
368
|
describe "when setting tags" do
|
285
369
|
before do
|
286
|
-
Fog::Compute::AWS.
|
287
|
-
@knife_ec2_create.
|
288
|
-
@ec2_connection.
|
289
|
-
@ec2_connection.
|
290
|
-
@new_ec2_server.
|
291
|
-
@ec2_servers.
|
292
|
-
@knife_ec2_create.
|
293
|
-
@knife_ec2_create.
|
370
|
+
expect(Fog::Compute::AWS).to receive(:new).and_return(@ec2_connection)
|
371
|
+
allow(@knife_ec2_create).to receive(:bootstrap_for_linux_node).and_return double("bootstrap", :run => true)
|
372
|
+
allow(@ec2_connection).to receive(:servers).and_return(@ec2_servers)
|
373
|
+
expect(@ec2_connection).to receive(:addresses)
|
374
|
+
allow(@new_ec2_server).to receive(:wait_for).and_return(true)
|
375
|
+
allow(@ec2_servers).to receive(:create).and_return(@new_ec2_server)
|
376
|
+
allow(@knife_ec2_create).to receive(:puts)
|
377
|
+
allow(@knife_ec2_create).to receive(:print)
|
294
378
|
end
|
295
379
|
|
296
380
|
it "sets the Name tag to the instance id by default" do
|
297
|
-
@ec2_connection.tags.
|
381
|
+
expect(@ec2_connection.tags).to receive(:create).with(:key => "Name",
|
298
382
|
:value => @new_ec2_server.id,
|
299
383
|
:resource_id => @new_ec2_server.id)
|
300
384
|
@knife_ec2_create.run
|
@@ -302,7 +386,7 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
302
386
|
|
303
387
|
it "sets the Name tag to the chef_node_name when given" do
|
304
388
|
@knife_ec2_create.config[:chef_node_name] = "wombat"
|
305
|
-
@ec2_connection.tags.
|
389
|
+
expect(@ec2_connection.tags).to receive(:create).with(:key => "Name",
|
306
390
|
:value => "wombat",
|
307
391
|
:resource_id => @new_ec2_server.id)
|
308
392
|
@knife_ec2_create.run
|
@@ -310,7 +394,7 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
310
394
|
|
311
395
|
it "sets the Name tag to the specified name when given --tags Name=NAME" do
|
312
396
|
@knife_ec2_create.config[:tags] = ["Name=bobcat"]
|
313
|
-
@ec2_connection.tags.
|
397
|
+
expect(@ec2_connection.tags).to receive(:create).with(:key => "Name",
|
314
398
|
:value => "bobcat",
|
315
399
|
:resource_id => @new_ec2_server.id)
|
316
400
|
@knife_ec2_create.run
|
@@ -318,7 +402,7 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
318
402
|
|
319
403
|
it "sets arbitrary tags" do
|
320
404
|
@knife_ec2_create.config[:tags] = ["foo=bar"]
|
321
|
-
@ec2_connection.tags.
|
405
|
+
expect(@ec2_connection.tags).to receive(:create).with(:key => "foo",
|
322
406
|
:value => "bar",
|
323
407
|
:resource_id => @new_ec2_server.id)
|
324
408
|
@knife_ec2_create.run
|
@@ -365,7 +449,7 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
365
449
|
Chef::Config[:knife][:s3_secret] =
|
366
450
|
's3://test.bucket/folder/encrypted_data_bag_secret'
|
367
451
|
@secret_content = "TEST DATA BAG SECRET\n"
|
368
|
-
@knife_ec2_create.
|
452
|
+
allow(@knife_ec2_create).to receive(:s3_secret).and_return(@secret_content)
|
369
453
|
end
|
370
454
|
|
371
455
|
it 'sets the secret to the expected test string' do
|
@@ -374,6 +458,59 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
374
458
|
end
|
375
459
|
end
|
376
460
|
|
461
|
+
context "when deprecated aws_ssh_key_id option is used in knife config and no ssh-key is supplied on the CLI" do
|
462
|
+
before do
|
463
|
+
Chef::Config[:knife][:aws_ssh_key_id] = "mykey"
|
464
|
+
Chef::Config[:knife].delete(:ssh_key_name)
|
465
|
+
@aws_key = Chef::Config[:knife][:aws_ssh_key_id]
|
466
|
+
allow(@knife_ec2_create).to receive(:ami).and_return(false)
|
467
|
+
end
|
468
|
+
|
469
|
+
it "gives warning message and creates the attribute with the required name" do
|
470
|
+
expect(@knife_ec2_create.ui).to receive(:warn).with("Use of aws_ssh_key_id option in knife.rb config is deprecated, use ssh_key_name option instead.")
|
471
|
+
@knife_ec2_create.validate!
|
472
|
+
expect(Chef::Config[:knife][:ssh_key_name]).to eq(@aws_key)
|
473
|
+
end
|
474
|
+
end
|
475
|
+
|
476
|
+
context "when deprecated aws_ssh_key_id option is used in knife config but ssh-key is also supplied on the CLI" do
|
477
|
+
before do
|
478
|
+
Chef::Config[:knife][:aws_ssh_key_id] = "mykey"
|
479
|
+
@aws_key = Chef::Config[:knife][:aws_ssh_key_id]
|
480
|
+
allow(@knife_ec2_create).to receive(:ami).and_return(false)
|
481
|
+
end
|
482
|
+
|
483
|
+
it "gives warning message and gives preference to CLI value over knife config's value" do
|
484
|
+
expect(@knife_ec2_create.ui).to receive(:warn).with("Use of aws_ssh_key_id option in knife.rb config is deprecated, use ssh_key_name option instead.")
|
485
|
+
@knife_ec2_create.validate!
|
486
|
+
expect(Chef::Config[:knife][:ssh_key_name]).to_not eq(@aws_key)
|
487
|
+
end
|
488
|
+
end
|
489
|
+
|
490
|
+
context "when ssh_key_name option is used in knife config instead of deprecated aws_ssh_key_id option" do
|
491
|
+
before do
|
492
|
+
Chef::Config[:knife][:ssh_key_name] = "mykey"
|
493
|
+
allow(@knife_ec2_create).to receive(:ami).and_return(false)
|
494
|
+
end
|
495
|
+
|
496
|
+
it "does nothing" do
|
497
|
+
@knife_ec2_create.validate!
|
498
|
+
end
|
499
|
+
end
|
500
|
+
|
501
|
+
context "when ssh_key_name option is used in knife config also it is passed on the CLI" do
|
502
|
+
before do
|
503
|
+
allow(Fog::Compute::AWS).to receive(:new).and_return(@ec2_connection)
|
504
|
+
Chef::Config[:knife][:ssh_key_name] = "mykey"
|
505
|
+
@knife_ec2_create.config[:ssh_key_name] = "ssh_key_name"
|
506
|
+
end
|
507
|
+
|
508
|
+
it "ssh-key passed over CLI gets preference over knife config value" do
|
509
|
+
server_def = @knife_ec2_create.create_server_def
|
510
|
+
expect(server_def[:key_name]).to eq(@knife_ec2_create.config[:ssh_key_name])
|
511
|
+
end
|
512
|
+
end
|
513
|
+
|
377
514
|
describe "when configuring the bootstrap process" do
|
378
515
|
before do
|
379
516
|
@knife_ec2_create.config[:ssh_user] = "ubuntu"
|
@@ -395,72 +532,72 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
395
532
|
end
|
396
533
|
|
397
534
|
it "should set the bootstrap 'name argument' to the hostname of the EC2 server" do
|
398
|
-
@bootstrap.name_args.
|
535
|
+
expect(@bootstrap.name_args).to eq(['ec2-75.101.253.10.compute-1.amazonaws.com'])
|
399
536
|
end
|
400
537
|
|
401
538
|
it "should set the bootstrap 'first_boot_attributes' correctly" do
|
402
|
-
@bootstrap.config[:first_boot_attributes].
|
539
|
+
expect(@bootstrap.config[:first_boot_attributes]).to eq("{'my_attributes':{'foo':'bar'}")
|
403
540
|
end
|
404
541
|
|
405
542
|
it "configures sets the bootstrap's run_list" do
|
406
|
-
@bootstrap.config[:run_list].
|
543
|
+
expect(@bootstrap.config[:run_list]).to eq(['role[base]'])
|
407
544
|
end
|
408
545
|
|
409
546
|
it "configures the bootstrap to use the correct ssh_user login" do
|
410
|
-
@bootstrap.config[:ssh_user].
|
547
|
+
expect(@bootstrap.config[:ssh_user]).to eq('ubuntu')
|
411
548
|
end
|
412
549
|
|
413
550
|
it "configures the bootstrap to use the correct ssh_gateway host" do
|
414
|
-
@bootstrap.config[:ssh_gateway].
|
551
|
+
expect(@bootstrap.config[:ssh_gateway]).to eq('bastion.host.com')
|
415
552
|
end
|
416
553
|
|
417
554
|
it "configures the bootstrap to use the correct ssh identity file" do
|
418
|
-
@bootstrap.config[:identity_file].
|
555
|
+
expect(@bootstrap.config[:identity_file]).to eq("~/.ssh/aws-key.pem")
|
419
556
|
end
|
420
557
|
|
421
558
|
it "configures the bootstrap to use the correct ssh_port number" do
|
422
|
-
@bootstrap.config[:ssh_port].
|
559
|
+
expect(@bootstrap.config[:ssh_port]).to eq(22)
|
423
560
|
end
|
424
561
|
|
425
562
|
it "configures the bootstrap to use the configured node name if provided" do
|
426
|
-
@bootstrap.config[:chef_node_name].
|
563
|
+
expect(@bootstrap.config[:chef_node_name]).to eq('blarf')
|
427
564
|
end
|
428
565
|
|
429
566
|
it "configures the bootstrap to use the EC2 server id if no explicit node name is set" do
|
430
567
|
@knife_ec2_create.config[:chef_node_name] = nil
|
431
568
|
|
432
569
|
bootstrap = @knife_ec2_create.bootstrap_for_linux_node(@new_ec2_server, @new_ec2_server.dns_name)
|
433
|
-
bootstrap.config[:chef_node_name].
|
570
|
+
expect(bootstrap.config[:chef_node_name]).to eq(@new_ec2_server.id)
|
434
571
|
end
|
435
572
|
|
436
573
|
it "configures the bootstrap to use prerelease versions of chef if specified" do
|
437
|
-
@bootstrap.config[:prerelease].
|
574
|
+
expect(@bootstrap.config[:prerelease]).to be_falsey
|
438
575
|
|
439
576
|
@knife_ec2_create.config[:prerelease] = true
|
440
577
|
|
441
578
|
bootstrap = @knife_ec2_create.bootstrap_for_linux_node(@new_ec2_server, @new_ec2_server.dns_name)
|
442
|
-
bootstrap.config[:prerelease].
|
579
|
+
expect(bootstrap.config[:prerelease]).to eq(true)
|
443
580
|
end
|
444
581
|
|
445
582
|
it "configures the bootstrap to use the desired distro-specific bootstrap script" do
|
446
|
-
@bootstrap.config[:distro].
|
583
|
+
expect(@bootstrap.config[:distro]).to eq('ubuntu-10.04-magic-sparkles')
|
447
584
|
end
|
448
585
|
|
449
586
|
it "configures the bootstrap to use sudo" do
|
450
|
-
@bootstrap.config[:use_sudo].
|
587
|
+
expect(@bootstrap.config[:use_sudo]).to eq(true)
|
451
588
|
end
|
452
589
|
|
453
590
|
it "configured the bootstrap to use the desired template" do
|
454
|
-
@bootstrap.config[:template_file].
|
591
|
+
expect(@bootstrap.config[:template_file]).to eq('~/.chef/templates/my-bootstrap.sh.erb')
|
455
592
|
end
|
456
593
|
|
457
594
|
it "configured the bootstrap to set an ec2 hint (via Chef::Config)" do
|
458
|
-
Chef::Config[:knife][:hints]["ec2"].
|
595
|
+
expect(Chef::Config[:knife][:hints]["ec2"]).not_to be_nil
|
459
596
|
end
|
460
597
|
end
|
461
598
|
describe "when configuring the winrm bootstrap process for windows" do
|
462
599
|
before do
|
463
|
-
@knife_ec2_create.
|
600
|
+
allow(@knife_ec2_create).to receive(:fetch_server_fqdn).and_return("SERVERNAME")
|
464
601
|
@knife_ec2_create.config[:winrm_user] = "Administrator"
|
465
602
|
@knife_ec2_create.config[:winrm_password] = "password"
|
466
603
|
@knife_ec2_create.config[:winrm_port] = 12345
|
@@ -482,44 +619,44 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
482
619
|
end
|
483
620
|
|
484
621
|
it "should set the winrm username correctly" do
|
485
|
-
@bootstrap.config[:winrm_user].
|
622
|
+
expect(@bootstrap.config[:winrm_user]).to eq(@knife_ec2_create.config[:winrm_user])
|
486
623
|
end
|
487
624
|
it "should set the winrm password correctly" do
|
488
|
-
@bootstrap.config[:winrm_password].
|
625
|
+
expect(@bootstrap.config[:winrm_password]).to eq(@knife_ec2_create.config[:winrm_password])
|
489
626
|
end
|
490
627
|
|
491
628
|
it "should set the winrm port correctly" do
|
492
|
-
@bootstrap.config[:winrm_port].
|
629
|
+
expect(@bootstrap.config[:winrm_port]).to eq(@knife_ec2_create.config[:winrm_port])
|
493
630
|
end
|
494
631
|
|
495
632
|
it "should set the winrm transport layer correctly" do
|
496
|
-
@bootstrap.config[:winrm_transport].
|
633
|
+
expect(@bootstrap.config[:winrm_transport]).to eq(@knife_ec2_create.config[:winrm_transport])
|
497
634
|
end
|
498
635
|
|
499
636
|
it "should set the kerberos realm correctly" do
|
500
|
-
@bootstrap.config[:kerberos_realm].
|
637
|
+
expect(@bootstrap.config[:kerberos_realm]).to eq(@knife_ec2_create.config[:kerberos_realm])
|
501
638
|
end
|
502
639
|
|
503
640
|
it "should set the kerberos service correctly" do
|
504
|
-
@bootstrap.config[:kerberos_service].
|
641
|
+
expect(@bootstrap.config[:kerberos_service]).to eq(@knife_ec2_create.config[:kerberos_service])
|
505
642
|
end
|
506
643
|
|
507
644
|
it "should set the bootstrap 'name argument' to the Windows/AD hostname of the EC2 server" do
|
508
|
-
@bootstrap.name_args.
|
645
|
+
expect(@bootstrap.name_args).to eq(["SERVERNAME"])
|
509
646
|
end
|
510
647
|
|
511
648
|
it "should set the bootstrap 'name argument' to the hostname of the EC2 server when AD/Kerberos is not used" do
|
512
649
|
@knife_ec2_create.config[:kerberos_realm] = nil
|
513
650
|
@bootstrap = @knife_ec2_create.bootstrap_for_windows_node(@new_ec2_server, @new_ec2_server.dns_name)
|
514
|
-
@bootstrap.name_args.
|
651
|
+
expect(@bootstrap.name_args).to eq(['ec2-75.101.253.10.compute-1.amazonaws.com'])
|
515
652
|
end
|
516
653
|
|
517
654
|
it "should set the bootstrap 'first_boot_attributes' correctly" do
|
518
|
-
@bootstrap.config[:first_boot_attributes].
|
655
|
+
expect(@bootstrap.config[:first_boot_attributes]).to eq("{'my_attributes':{'foo':'bar'}")
|
519
656
|
end
|
520
657
|
|
521
658
|
it "configures sets the bootstrap's run_list" do
|
522
|
-
@bootstrap.config[:run_list].
|
659
|
+
expect(@bootstrap.config[:run_list]).to eq(['role[base]'])
|
523
660
|
end
|
524
661
|
|
525
662
|
it "configures auth_timeout for bootstrap to default to 25 minutes" do
|
@@ -535,12 +672,12 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
535
672
|
|
536
673
|
describe "when validating the command-line parameters" do
|
537
674
|
before do
|
538
|
-
Fog::Compute::AWS.
|
539
|
-
@knife_ec2_create.ui.
|
540
|
-
@knife_ec2_create.ui.
|
675
|
+
allow(Fog::Compute::AWS).to receive(:new).and_return(@ec2_connection)
|
676
|
+
allow(@knife_ec2_create.ui).to receive(:error)
|
677
|
+
allow(@knife_ec2_create.ui).to receive(:msg)
|
541
678
|
end
|
542
679
|
|
543
|
-
describe "when reading aws_credential_file" do
|
680
|
+
describe "when reading aws_credential_file" do
|
544
681
|
before do
|
545
682
|
Chef::Config[:knife].delete(:aws_access_key_id)
|
546
683
|
Chef::Config[:knife].delete(:aws_secret_access_key)
|
@@ -551,49 +688,49 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
551
688
|
end
|
552
689
|
|
553
690
|
it "reads UNIX Line endings" do
|
554
|
-
File.
|
691
|
+
allow(File).to receive(:read).
|
555
692
|
and_return("AWSAccessKeyId=#{@access_key_id}\nAWSSecretKey=#{@secret_key}")
|
556
693
|
@knife_ec2_create.validate!
|
557
|
-
Chef::Config[:knife][:aws_access_key_id].
|
558
|
-
Chef::Config[:knife][:aws_secret_access_key].
|
694
|
+
expect(Chef::Config[:knife][:aws_access_key_id]).to eq(@access_key_id)
|
695
|
+
expect(Chef::Config[:knife][:aws_secret_access_key]).to eq(@secret_key)
|
559
696
|
end
|
560
697
|
|
561
698
|
it "reads DOS Line endings" do
|
562
|
-
File.
|
699
|
+
allow(File).to receive(:read).
|
563
700
|
and_return("AWSAccessKeyId=#{@access_key_id}\r\nAWSSecretKey=#{@secret_key}")
|
564
701
|
@knife_ec2_create.validate!
|
565
|
-
Chef::Config[:knife][:aws_access_key_id].
|
566
|
-
Chef::Config[:knife][:aws_secret_access_key].
|
702
|
+
expect(Chef::Config[:knife][:aws_access_key_id]).to eq(@access_key_id)
|
703
|
+
expect(Chef::Config[:knife][:aws_secret_access_key]).to eq(@secret_key)
|
567
704
|
end
|
568
705
|
it "reads UNIX Line endings for new format" do
|
569
|
-
File.
|
706
|
+
allow(File).to receive(:read).
|
570
707
|
and_return("aws_access_key_id=#{@access_key_id}\naws_secret_access_key=#{@secret_key}")
|
571
708
|
@knife_ec2_create.validate!
|
572
|
-
Chef::Config[:knife][:aws_access_key_id].
|
573
|
-
Chef::Config[:knife][:aws_secret_access_key].
|
709
|
+
expect(Chef::Config[:knife][:aws_access_key_id]).to eq(@access_key_id)
|
710
|
+
expect(Chef::Config[:knife][:aws_secret_access_key]).to eq(@secret_key)
|
574
711
|
end
|
575
712
|
|
576
713
|
it "reads DOS Line endings for new format" do
|
577
|
-
File.
|
714
|
+
allow(File).to receive(:read).
|
578
715
|
and_return("aws_access_key_id=#{@access_key_id}\r\naws_secret_access_key=#{@secret_key}")
|
579
716
|
@knife_ec2_create.validate!
|
580
|
-
Chef::Config[:knife][:aws_access_key_id].
|
581
|
-
Chef::Config[:knife][:aws_secret_access_key].
|
717
|
+
expect(Chef::Config[:knife][:aws_access_key_id]).to eq(@access_key_id)
|
718
|
+
expect(Chef::Config[:knife][:aws_secret_access_key]).to eq(@secret_key)
|
582
719
|
end
|
583
720
|
end
|
584
721
|
|
585
722
|
it 'understands that file:// validation key URIs are just paths' do
|
586
723
|
Chef::Config[:knife][:validation_key_url] = 'file:///foo/bar'
|
587
|
-
@knife_ec2_create.validation_key_path.
|
724
|
+
expect(@knife_ec2_create.validation_key_path).to eq('/foo/bar')
|
588
725
|
end
|
589
726
|
|
590
727
|
it 'returns a path to a tmp file when presented with a URI for the ' \
|
591
728
|
'validation key' do
|
592
729
|
Chef::Config[:knife][:validation_key_url] = @validation_key_url
|
593
730
|
|
594
|
-
@knife_ec2_create.
|
731
|
+
allow(@knife_ec2_create).to receive_message_chain(:validation_key_tmpfile, :path).and_return(@validation_key_file)
|
595
732
|
|
596
|
-
@knife_ec2_create.validation_key_path.
|
733
|
+
expect(@knife_ec2_create.validation_key_path).to eq(@validation_key_file)
|
597
734
|
end
|
598
735
|
|
599
736
|
it "disallows security group names when using a VPC" do
|
@@ -601,55 +738,101 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
601
738
|
@knife_ec2_create.config[:security_group_ids] = 'sg-aabbccdd'
|
602
739
|
@knife_ec2_create.config[:security_groups] = 'groupname'
|
603
740
|
|
604
|
-
|
741
|
+
expect { @knife_ec2_create.validate! }.to raise_error SystemExit
|
605
742
|
end
|
606
743
|
|
607
744
|
it "disallows private ips when not using a VPC" do
|
608
745
|
@knife_ec2_create.config[:private_ip_address] = '10.0.0.10'
|
609
746
|
|
610
|
-
|
747
|
+
expect { @knife_ec2_create.validate! }.to raise_error SystemExit
|
611
748
|
end
|
612
749
|
|
613
750
|
it "disallows specifying credentials file and aws keys" do
|
614
751
|
Chef::Config[:knife][:aws_credential_file] = '/apple/pear'
|
615
|
-
File.
|
752
|
+
allow(File).to receive(:read).and_return("AWSAccessKeyId=b\nAWSSecretKey=a")
|
616
753
|
|
617
|
-
|
754
|
+
expect { @knife_ec2_create.validate! }.to raise_error SystemExit
|
618
755
|
end
|
619
756
|
|
620
757
|
it "disallows associate public ip option when not using a VPC" do
|
621
758
|
@knife_ec2_create.config[:associate_public_ip] = true
|
622
759
|
@knife_ec2_create.config[:subnet_id] = nil
|
623
760
|
|
624
|
-
|
761
|
+
expect { @knife_ec2_create.validate! }.to raise_error SystemExit
|
625
762
|
end
|
626
763
|
|
627
764
|
it "disallows ebs provisioned iops option when not using ebs volume type" do
|
628
765
|
@knife_ec2_create.config[:ebs_provisioned_iops] = "123"
|
629
766
|
@knife_ec2_create.config[:ebs_volume_type] = nil
|
630
767
|
|
631
|
-
|
768
|
+
expect { @knife_ec2_create.validate! }.to raise_error SystemExit
|
632
769
|
end
|
633
770
|
|
634
771
|
it "disallows ebs provisioned iops option when not using ebs volume type 'io1'" do
|
635
772
|
@knife_ec2_create.config[:ebs_provisioned_iops] = "123"
|
636
773
|
@knife_ec2_create.config[:ebs_volume_type] = "standard"
|
637
774
|
|
638
|
-
|
775
|
+
expect { @knife_ec2_create.validate! }.to raise_error SystemExit
|
639
776
|
end
|
640
777
|
|
641
778
|
it "disallows ebs volume type if its other than 'io1' or 'gp2' or 'standard'" do
|
642
779
|
@knife_ec2_create.config[:ebs_provisioned_iops] = "123"
|
643
780
|
@knife_ec2_create.config[:ebs_volume_type] = 'invalid'
|
644
781
|
|
645
|
-
|
782
|
+
expect { @knife_ec2_create.validate! }.to raise_error SystemExit
|
646
783
|
end
|
647
784
|
|
648
785
|
it "disallows 'io1' ebs volume type when not using ebs provisioned iops" do
|
649
786
|
@knife_ec2_create.config[:ebs_provisioned_iops] = nil
|
650
787
|
@knife_ec2_create.config[:ebs_volume_type] = 'io1'
|
651
788
|
|
652
|
-
|
789
|
+
expect { @knife_ec2_create.validate! }.to raise_error SystemExit
|
790
|
+
end
|
791
|
+
|
792
|
+
context "when ebs_encrypted option specified" do
|
793
|
+
it "not raise any validation error if valid ebs_size specified" do
|
794
|
+
@knife_ec2_create.config[:ebs_size] = "8"
|
795
|
+
@knife_ec2_create.config[:flavor] = "m3.medium"
|
796
|
+
@knife_ec2_create.config[:ebs_encrypted] = true
|
797
|
+
expect(@knife_ec2_create.ui).to_not receive(:error).with(" --ebs-encrypted option requires valid --ebs-size to be specified.")
|
798
|
+
@knife_ec2_create.validate!
|
799
|
+
end
|
800
|
+
|
801
|
+
it "raise error on missing ebs_size" do
|
802
|
+
@knife_ec2_create.config[:ebs_size] = nil
|
803
|
+
@knife_ec2_create.config[:flavor] = "m3.medium"
|
804
|
+
@knife_ec2_create.config[:ebs_encrypted] = true
|
805
|
+
expect(@knife_ec2_create.ui).to receive(:error).with(" --ebs-encrypted option requires valid --ebs-size to be specified.")
|
806
|
+
expect { @knife_ec2_create.validate! }.to raise_error SystemExit
|
807
|
+
end
|
808
|
+
|
809
|
+
it "raise error if invalid ebs_size specified for 'standard' VolumeType" do
|
810
|
+
@knife_ec2_create.config[:ebs_size] = "1055"
|
811
|
+
@knife_ec2_create.config[:ebs_volume_type] = 'standard'
|
812
|
+
@knife_ec2_create.config[:flavor] = "m3.medium"
|
813
|
+
@knife_ec2_create.config[:ebs_encrypted] = true
|
814
|
+
expect(@knife_ec2_create.ui).to receive(:error).with(" --ebs-size should be in between 1-1024 for 'standard' ebs volume type.")
|
815
|
+
expect { @knife_ec2_create.validate! }.to raise_error SystemExit
|
816
|
+
end
|
817
|
+
|
818
|
+
it "raise error on invalid ebs_size specified for 'gp2' VolumeType" do
|
819
|
+
@knife_ec2_create.config[:ebs_size] = "16500"
|
820
|
+
@knife_ec2_create.config[:ebs_volume_type] = 'gp2'
|
821
|
+
@knife_ec2_create.config[:flavor] = "m3.medium"
|
822
|
+
@knife_ec2_create.config[:ebs_encrypted] = true
|
823
|
+
expect(@knife_ec2_create.ui).to receive(:error).with(" --ebs-size should be in between 1-16384 for 'gp2' ebs volume type.")
|
824
|
+
expect { @knife_ec2_create.validate! }.to raise_error SystemExit
|
825
|
+
end
|
826
|
+
|
827
|
+
it "raise error on invalid ebs_size specified for 'io1' VolumeType" do
|
828
|
+
@knife_ec2_create.config[:ebs_size] = "3"
|
829
|
+
@knife_ec2_create.config[:ebs_provisioned_iops] = "200"
|
830
|
+
@knife_ec2_create.config[:ebs_volume_type] = 'io1'
|
831
|
+
@knife_ec2_create.config[:flavor] = "m3.medium"
|
832
|
+
@knife_ec2_create.config[:ebs_encrypted] = true
|
833
|
+
expect(@knife_ec2_create.ui).to receive(:error).with(" --ebs-size should be in between 4-16384 for 'io1' ebs volume type.")
|
834
|
+
expect { @knife_ec2_create.validate! }.to raise_error SystemExit
|
835
|
+
end
|
653
836
|
end
|
654
837
|
end
|
655
838
|
|
@@ -662,7 +845,15 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
662
845
|
|
663
846
|
it "creates a connection without access keys" do
|
664
847
|
@knife_ec2_create.config[:use_iam_profile] = true
|
665
|
-
Fog::Compute::AWS.
|
848
|
+
expect(Fog::Compute::AWS).to receive(:new).with(hash_including(:use_iam_profile => true)).and_return(@ec2_connection)
|
849
|
+
@knife_ec2_create.connection
|
850
|
+
end
|
851
|
+
end
|
852
|
+
|
853
|
+
describe "when aws_session_token is present" do
|
854
|
+
it "creates a connection using the session token" do
|
855
|
+
@knife_ec2_create.config[:aws_session_token] = 'session-token'
|
856
|
+
expect(Fog::Compute::AWS).to receive(:new).with(hash_including(:aws_session_token => 'session-token')).and_return(@ec2_connection)
|
666
857
|
@knife_ec2_create.connection
|
667
858
|
end
|
668
859
|
end
|
@@ -670,28 +861,28 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
670
861
|
|
671
862
|
describe "when creating the server definition" do
|
672
863
|
before do
|
673
|
-
Fog::Compute::AWS.
|
864
|
+
allow(Fog::Compute::AWS).to receive(:new).and_return(@ec2_connection)
|
674
865
|
end
|
675
866
|
|
676
867
|
it "sets the specified placement_group" do
|
677
868
|
@knife_ec2_create.config[:placement_group] = ['some_placement_group']
|
678
869
|
server_def = @knife_ec2_create.create_server_def
|
679
870
|
|
680
|
-
server_def[:placement_group].
|
871
|
+
expect(server_def[:placement_group]).to eq(['some_placement_group'])
|
681
872
|
end
|
682
873
|
|
683
874
|
it "sets the specified security group names" do
|
684
875
|
@knife_ec2_create.config[:security_groups] = ['groupname']
|
685
876
|
server_def = @knife_ec2_create.create_server_def
|
686
877
|
|
687
|
-
server_def[:groups].
|
878
|
+
expect(server_def[:groups]).to eq(['groupname'])
|
688
879
|
end
|
689
880
|
|
690
881
|
it "sets the specified security group ids" do
|
691
882
|
@knife_ec2_create.config[:security_group_ids] = ['sg-aabbccdd']
|
692
883
|
server_def = @knife_ec2_create.create_server_def
|
693
884
|
|
694
|
-
server_def[:security_group_ids].
|
885
|
+
expect(server_def[:security_group_ids]).to eq(['sg-aabbccdd'])
|
695
886
|
end
|
696
887
|
|
697
888
|
it "sets the image id from CLI arguments over knife config" do
|
@@ -699,7 +890,7 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
699
890
|
Chef::Config[:knife][:image] = "ami-zzz"
|
700
891
|
server_def = @knife_ec2_create.create_server_def
|
701
892
|
|
702
|
-
server_def[:image_id].
|
893
|
+
expect(server_def[:image_id]).to eq("ami-aaa")
|
703
894
|
end
|
704
895
|
|
705
896
|
it "sets the flavor id from CLI arguments over knife config" do
|
@@ -707,7 +898,7 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
707
898
|
Chef::Config[:knife][:flavor] = "bitty"
|
708
899
|
server_def = @knife_ec2_create.create_server_def
|
709
900
|
|
710
|
-
server_def[:flavor_id].
|
901
|
+
expect(server_def[:flavor_id]).to eq("massive")
|
711
902
|
end
|
712
903
|
|
713
904
|
it "sets the availability zone from CLI arguments over knife config" do
|
@@ -715,17 +906,17 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
715
906
|
Chef::Config[:knife][:availability_zone] = "dat-one"
|
716
907
|
server_def = @knife_ec2_create.create_server_def
|
717
908
|
|
718
|
-
server_def[:availability_zone].
|
909
|
+
expect(server_def[:availability_zone]).to eq("dis-one")
|
719
910
|
end
|
720
911
|
|
721
912
|
it "adds the specified ephemeral device mappings" do
|
722
913
|
@knife_ec2_create.config[:ephemeral] = [ "/dev/sdb", "/dev/sdc", "/dev/sdd", "/dev/sde" ]
|
723
914
|
server_def = @knife_ec2_create.create_server_def
|
724
915
|
|
725
|
-
server_def[:block_device_mapping].
|
916
|
+
expect(server_def[:block_device_mapping]).to eq([{ "VirtualName" => "ephemeral0", "DeviceName" => "/dev/sdb" },
|
726
917
|
{ "VirtualName" => "ephemeral1", "DeviceName" => "/dev/sdc" },
|
727
918
|
{ "VirtualName" => "ephemeral2", "DeviceName" => "/dev/sdd" },
|
728
|
-
{ "VirtualName" => "ephemeral3", "DeviceName" => "/dev/sde" }]
|
919
|
+
{ "VirtualName" => "ephemeral3", "DeviceName" => "/dev/sde" }])
|
729
920
|
end
|
730
921
|
|
731
922
|
it "sets the specified private ip address" do
|
@@ -733,94 +924,105 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
733
924
|
@knife_ec2_create.config[:private_ip_address] = '10.0.0.10'
|
734
925
|
server_def = @knife_ec2_create.create_server_def
|
735
926
|
|
736
|
-
server_def[:subnet_id].
|
737
|
-
server_def[:private_ip_address].
|
927
|
+
expect(server_def[:subnet_id]).to eq('subnet-1a2b3c4d')
|
928
|
+
expect(server_def[:private_ip_address]).to eq('10.0.0.10')
|
738
929
|
end
|
739
930
|
|
740
931
|
it "sets the IAM server role when one is specified" do
|
741
932
|
@knife_ec2_create.config[:iam_instance_profile] = ['iam-role']
|
742
933
|
server_def = @knife_ec2_create.create_server_def
|
743
934
|
|
744
|
-
server_def[:iam_instance_profile_name].
|
935
|
+
expect(server_def[:iam_instance_profile_name]).to eq(['iam-role'])
|
745
936
|
end
|
746
937
|
|
747
938
|
it "doesn't set an IAM server role by default" do
|
748
939
|
server_def = @knife_ec2_create.create_server_def
|
749
940
|
|
750
|
-
server_def[:iam_instance_profile_name].
|
941
|
+
expect(server_def[:iam_instance_profile_name]).to eq(nil)
|
751
942
|
end
|
752
943
|
|
753
944
|
it "doesn't use IAM profile by default" do
|
754
945
|
server_def = @knife_ec2_create.create_server_def
|
755
946
|
|
756
|
-
server_def[:use_iam_profile].
|
947
|
+
expect(server_def[:use_iam_profile]).to eq(nil)
|
757
948
|
end
|
758
|
-
|
949
|
+
|
759
950
|
it 'Set Tenancy Dedicated when both VPC mode and Flag is True' do
|
760
951
|
@knife_ec2_create.config[:dedicated_instance] = true
|
761
|
-
@knife_ec2_create.
|
762
|
-
|
952
|
+
allow(@knife_ec2_create).to receive_messages(:vpc_mode? => true)
|
763
953
|
server_def = @knife_ec2_create.create_server_def
|
764
|
-
server_def[:tenancy].
|
954
|
+
expect(server_def[:tenancy]).to eq("dedicated")
|
765
955
|
end
|
766
|
-
|
956
|
+
|
767
957
|
it 'Tenancy should be default with no vpc mode even is specified' do
|
768
958
|
@knife_ec2_create.config[:dedicated_instance] = true
|
769
|
-
|
770
959
|
server_def = @knife_ec2_create.create_server_def
|
771
|
-
server_def[:tenancy].
|
960
|
+
expect(server_def[:tenancy]).to eq(nil)
|
772
961
|
end
|
773
|
-
|
962
|
+
|
774
963
|
it 'Tenancy should be default with vpc but not requested' do
|
775
|
-
@knife_ec2_create.
|
776
|
-
|
964
|
+
allow(@knife_ec2_create).to receive_messages(:vpc_mode? => true)
|
777
965
|
server_def = @knife_ec2_create.create_server_def
|
778
|
-
server_def[:tenancy].
|
966
|
+
expect(server_def[:tenancy]).to eq(nil)
|
779
967
|
end
|
780
|
-
|
968
|
+
|
781
969
|
it "sets associate_public_ip to true if specified and in vpc_mode" do
|
782
970
|
@knife_ec2_create.config[:subnet_id] = 'subnet-1a2b3c4d'
|
783
971
|
@knife_ec2_create.config[:associate_public_ip] = true
|
784
972
|
server_def = @knife_ec2_create.create_server_def
|
785
973
|
|
786
|
-
server_def[:subnet_id].
|
787
|
-
server_def[:associate_public_ip].
|
974
|
+
expect(server_def[:subnet_id]).to eq('subnet-1a2b3c4d')
|
975
|
+
expect(server_def[:associate_public_ip]).to eq(true)
|
788
976
|
end
|
789
977
|
|
790
978
|
it "sets the spot price" do
|
791
979
|
@knife_ec2_create.config[:spot_price] = '1.99'
|
792
980
|
server_def = @knife_ec2_create.create_server_def
|
793
981
|
|
794
|
-
server_def[:price].
|
982
|
+
expect(server_def[:price]).to eq('1.99')
|
983
|
+
end
|
984
|
+
|
985
|
+
it "sets the spot instance request type as persistent" do
|
986
|
+
@knife_ec2_create.config[:spot_request_type] = 'persistent'
|
987
|
+
server_def = @knife_ec2_create.create_server_def
|
988
|
+
|
989
|
+
expect(server_def[:request_type]).to eq('persistent')
|
990
|
+
end
|
991
|
+
|
992
|
+
it "sets the spot instance request type as one-time" do
|
993
|
+
@knife_ec2_create.config[:spot_request_type] = 'one-time'
|
994
|
+
server_def = @knife_ec2_create.create_server_def
|
995
|
+
|
996
|
+
expect(server_def[:request_type]).to eq('one-time')
|
795
997
|
end
|
796
998
|
|
797
999
|
context "when using ebs volume type and ebs provisioned iops rate options" do
|
798
1000
|
before do
|
799
|
-
@knife_ec2_create.
|
800
|
-
@knife_ec2_create.
|
801
|
-
@knife_ec2_create.
|
802
|
-
@knife_ec2_create.
|
1001
|
+
allow(@knife_ec2_create).to receive_message_chain(:ami, :root_device_type).and_return("ebs")
|
1002
|
+
allow(@knife_ec2_create).to receive_message_chain(:ami, :block_device_mapping).and_return([{"iops" => 123}])
|
1003
|
+
allow(@knife_ec2_create).to receive(:msg)
|
1004
|
+
allow(@knife_ec2_create).to receive(:puts)
|
803
1005
|
end
|
804
1006
|
|
805
1007
|
it "sets the specified 'standard' ebs volume type" do
|
806
1008
|
@knife_ec2_create.config[:ebs_volume_type] = 'standard'
|
807
1009
|
server_def = @knife_ec2_create.create_server_def
|
808
1010
|
|
809
|
-
server_def[:block_device_mapping].first['Ebs.VolumeType'].
|
1011
|
+
expect(server_def[:block_device_mapping].first['Ebs.VolumeType']).to eq('standard')
|
810
1012
|
end
|
811
1013
|
|
812
1014
|
it "sets the specified 'io1' ebs volume type" do
|
813
1015
|
@knife_ec2_create.config[:ebs_volume_type] = 'io1'
|
814
1016
|
server_def = @knife_ec2_create.create_server_def
|
815
1017
|
|
816
|
-
server_def[:block_device_mapping].first['Ebs.VolumeType'].
|
1018
|
+
expect(server_def[:block_device_mapping].first['Ebs.VolumeType']).to eq('io1')
|
817
1019
|
end
|
818
1020
|
|
819
1021
|
it "sets the specified 'gp2' ebs volume type" do
|
820
1022
|
@knife_ec2_create.config[:ebs_volume_type] = 'gp2'
|
821
1023
|
server_def = @knife_ec2_create.create_server_def
|
822
1024
|
|
823
|
-
server_def[:block_device_mapping].first['Ebs.VolumeType'].
|
1025
|
+
expect(server_def[:block_device_mapping].first['Ebs.VolumeType']).to eq('gp2')
|
824
1026
|
end
|
825
1027
|
|
826
1028
|
it "sets the specified ebs provisioned iops rate" do
|
@@ -828,20 +1030,20 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
828
1030
|
@knife_ec2_create.config[:ebs_volume_type] = 'io1'
|
829
1031
|
server_def = @knife_ec2_create.create_server_def
|
830
1032
|
|
831
|
-
server_def[:block_device_mapping].first['Ebs.Iops'].
|
1033
|
+
expect(server_def[:block_device_mapping].first['Ebs.Iops']).to eq('1234')
|
832
1034
|
end
|
833
1035
|
|
834
1036
|
it "disallows non integer ebs provisioned iops rate" do
|
835
1037
|
@knife_ec2_create.config[:ebs_provisioned_iops] = "123abcd"
|
836
1038
|
|
837
|
-
|
1039
|
+
expect { @knife_ec2_create.create_server_def }.to raise_error SystemExit
|
838
1040
|
end
|
839
1041
|
|
840
1042
|
it "sets the iops rate from ami" do
|
841
1043
|
@knife_ec2_create.config[:ebs_volume_type] = 'io1'
|
842
1044
|
server_def = @knife_ec2_create.create_server_def
|
843
1045
|
|
844
|
-
server_def[:block_device_mapping].first['Ebs.Iops'].
|
1046
|
+
expect(server_def[:block_device_mapping].first['Ebs.Iops']).to eq('123')
|
845
1047
|
end
|
846
1048
|
end
|
847
1049
|
end
|
@@ -851,15 +1053,15 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
851
1053
|
let(:hostname) { 'test.host.com' }
|
852
1054
|
|
853
1055
|
it "should wait for tunnelled ssh if a ssh gateway is provided" do
|
854
|
-
@knife_ec2_create.
|
855
|
-
@knife_ec2_create.
|
1056
|
+
allow(@knife_ec2_create).to receive(:get_ssh_gateway_for).and_return(gateway)
|
1057
|
+
expect(@knife_ec2_create).to receive(:wait_for_tunnelled_sshd).with(gateway, hostname)
|
856
1058
|
@knife_ec2_create.wait_for_sshd(hostname)
|
857
1059
|
end
|
858
1060
|
|
859
1061
|
it "should wait for direct ssh if a ssh gateway is not provided" do
|
860
|
-
@knife_ec2_create.
|
1062
|
+
allow(@knife_ec2_create).to receive(:get_ssh_gateway_for).and_return(nil)
|
861
1063
|
@knife_ec2_create.config[:ssh_port] = 22
|
862
|
-
@knife_ec2_create.
|
1064
|
+
expect(@knife_ec2_create).to receive(:wait_for_direct_sshd).with(hostname, 22)
|
863
1065
|
@knife_ec2_create.wait_for_sshd(hostname)
|
864
1066
|
end
|
865
1067
|
end
|
@@ -869,70 +1071,70 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
869
1071
|
let(:hostname) { 'test.host.com' }
|
870
1072
|
|
871
1073
|
it "should give precedence to the ssh gateway specified in the knife configuration" do
|
872
|
-
Net::SSH::Config.
|
1074
|
+
allow(Net::SSH::Config).to receive(:for).and_return(:proxy => Net::SSH::Proxy::Command.new("ssh some.other.gateway.com nc %h %p"))
|
873
1075
|
@knife_ec2_create.config[:ssh_gateway] = gateway
|
874
|
-
@knife_ec2_create.get_ssh_gateway_for(hostname).
|
1076
|
+
expect(@knife_ec2_create.get_ssh_gateway_for(hostname)).to eq(gateway)
|
875
1077
|
end
|
876
1078
|
|
877
1079
|
it "should return the ssh gateway specified in the ssh configuration even if the config option is not set" do
|
878
1080
|
# This should already be false, but test this explicitly for regression
|
879
1081
|
@knife_ec2_create.config[:ssh_gateway] = false
|
880
|
-
Net::SSH::Config.
|
881
|
-
@knife_ec2_create.get_ssh_gateway_for(hostname).
|
1082
|
+
allow(Net::SSH::Config).to receive(:for).and_return(:proxy => Net::SSH::Proxy::Command.new("ssh #{gateway} nc %h %p"))
|
1083
|
+
expect(@knife_ec2_create.get_ssh_gateway_for(hostname)).to eq(gateway)
|
882
1084
|
end
|
883
1085
|
|
884
1086
|
it "should return nil if the ssh gateway cannot be parsed from the ssh proxy command" do
|
885
|
-
Net::SSH::Config.
|
886
|
-
@knife_ec2_create.get_ssh_gateway_for(hostname).
|
1087
|
+
allow(Net::SSH::Config).to receive(:for).and_return(:proxy => Net::SSH::Proxy::Command.new("cannot parse host"))
|
1088
|
+
expect(@knife_ec2_create.get_ssh_gateway_for(hostname)).to be_nil
|
887
1089
|
end
|
888
1090
|
|
889
1091
|
it "should return nil if the ssh proxy is not a proxy command" do
|
890
|
-
Net::SSH::Config.
|
891
|
-
@knife_ec2_create.get_ssh_gateway_for(hostname).
|
1092
|
+
allow(Net::SSH::Config).to receive(:for).and_return(:proxy => Net::SSH::Proxy::HTTP.new("httphost.com"))
|
1093
|
+
expect(@knife_ec2_create.get_ssh_gateway_for(hostname)).to be_nil
|
892
1094
|
end
|
893
1095
|
|
894
1096
|
it "returns nil if the ssh config has no proxy" do
|
895
|
-
Net::SSH::Config.
|
896
|
-
@knife_ec2_create.get_ssh_gateway_for(hostname).
|
1097
|
+
allow(Net::SSH::Config).to receive(:for).and_return(:user => "darius")
|
1098
|
+
expect(@knife_ec2_create.get_ssh_gateway_for(hostname)).to be_nil
|
897
1099
|
end
|
898
1100
|
|
899
1101
|
end
|
900
1102
|
|
901
1103
|
describe "ssh_connect_host" do
|
902
1104
|
before(:each) do
|
903
|
-
@new_ec2_server.
|
1105
|
+
allow(@new_ec2_server).to receive_messages(
|
904
1106
|
:dns_name => 'public_name',
|
905
1107
|
:private_ip_address => 'private_ip',
|
906
1108
|
:custom => 'custom',
|
907
1109
|
:public_ip_address => '111.111.111.111'
|
908
1110
|
)
|
909
|
-
@knife_ec2_create.
|
1111
|
+
allow(@knife_ec2_create).to receive_messages(:server => @new_ec2_server)
|
910
1112
|
end
|
911
1113
|
|
912
1114
|
describe "by default" do
|
913
1115
|
it 'should use public dns name' do
|
914
|
-
@knife_ec2_create.ssh_connect_host.
|
1116
|
+
expect(@knife_ec2_create.ssh_connect_host).to eq('public_name')
|
915
1117
|
end
|
916
1118
|
end
|
917
1119
|
|
918
1120
|
describe "when dns name not exist" do
|
919
1121
|
it 'should use public_ip_address ' do
|
920
|
-
@new_ec2_server.
|
921
|
-
@knife_ec2_create.ssh_connect_host.
|
1122
|
+
allow(@new_ec2_server).to receive(:dns_name).and_return(nil)
|
1123
|
+
expect(@knife_ec2_create.ssh_connect_host).to eq('111.111.111.111')
|
922
1124
|
end
|
923
1125
|
end
|
924
1126
|
|
925
1127
|
describe "with vpc_mode?" do
|
926
1128
|
it 'should use private ip' do
|
927
|
-
@knife_ec2_create.
|
928
|
-
@knife_ec2_create.ssh_connect_host.
|
1129
|
+
allow(@knife_ec2_create).to receive_messages(:vpc_mode? => true)
|
1130
|
+
expect(@knife_ec2_create.ssh_connect_host).to eq('private_ip')
|
929
1131
|
end
|
930
1132
|
end
|
931
1133
|
|
932
1134
|
describe "with custom server attribute" do
|
933
1135
|
it 'should use custom server attribute' do
|
934
1136
|
@knife_ec2_create.config[:server_connect_attribute] = 'custom'
|
935
|
-
@knife_ec2_create.ssh_connect_host.
|
1137
|
+
expect(@knife_ec2_create.ssh_connect_host).to eq('custom')
|
936
1138
|
end
|
937
1139
|
end
|
938
1140
|
end
|
@@ -944,14 +1146,14 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
944
1146
|
let(:local_port) { 23 }
|
945
1147
|
|
946
1148
|
before(:each) do
|
947
|
-
@knife_ec2_create.
|
1149
|
+
allow(@knife_ec2_create).to receive(:configure_ssh_gateway).and_return(gateway)
|
948
1150
|
end
|
949
1151
|
|
950
1152
|
it "should test ssh through a gateway" do
|
951
1153
|
@knife_ec2_create.config[:ssh_port] = 22
|
952
|
-
gateway.
|
953
|
-
@knife_ec2_create.
|
954
|
-
@knife_ec2_create.tunnel_test_ssh(gateway_host, hostname).
|
1154
|
+
expect(gateway).to receive(:open).with(hostname, 22).and_yield(local_port)
|
1155
|
+
expect(@knife_ec2_create).to receive(:tcp_test_ssh).with('localhost', local_port).and_return(true)
|
1156
|
+
expect(@knife_ec2_create.tunnel_test_ssh(gateway_host, hostname)).to eq(true)
|
955
1157
|
end
|
956
1158
|
end
|
957
1159
|
|
@@ -960,46 +1162,46 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
960
1162
|
let(:gateway_user) { 'gateway_user' }
|
961
1163
|
|
962
1164
|
it "configures a ssh gateway with no user and the default port when the SSH Config is empty" do
|
963
|
-
Net::SSH::Config.
|
964
|
-
Net::SSH::Gateway.
|
1165
|
+
allow(Net::SSH::Config).to receive(:for).and_return({})
|
1166
|
+
expect(Net::SSH::Gateway).to receive(:new).with(gateway_host, nil, :port => 22)
|
965
1167
|
@knife_ec2_create.configure_ssh_gateway(gateway_host)
|
966
1168
|
end
|
967
1169
|
|
968
1170
|
it "configures a ssh gateway with the user specified in the SSH Config" do
|
969
|
-
Net::SSH::Config.
|
970
|
-
Net::SSH::Gateway.
|
1171
|
+
allow(Net::SSH::Config).to receive(:for).and_return({ :user => gateway_user })
|
1172
|
+
expect(Net::SSH::Gateway).to receive(:new).with(gateway_host, gateway_user, :port => 22)
|
971
1173
|
@knife_ec2_create.configure_ssh_gateway(gateway_host)
|
972
1174
|
end
|
973
1175
|
|
974
1176
|
it "configures a ssh gateway with the user specified in the ssh gateway string" do
|
975
|
-
Net::SSH::Config.
|
976
|
-
Net::SSH::Gateway.
|
1177
|
+
allow(Net::SSH::Config).to receive(:for).and_return({ :user => gateway_user })
|
1178
|
+
expect(Net::SSH::Gateway).to receive(:new).with(gateway_host, 'override_user', :port => 22)
|
977
1179
|
@knife_ec2_create.configure_ssh_gateway("override_user@#{gateway_host}")
|
978
1180
|
end
|
979
1181
|
|
980
1182
|
it "configures a ssh gateway with the port specified in the ssh gateway string" do
|
981
|
-
Net::SSH::Config.
|
982
|
-
Net::SSH::Gateway.
|
1183
|
+
allow(Net::SSH::Config).to receive(:for).and_return({})
|
1184
|
+
expect(Net::SSH::Gateway).to receive(:new).with(gateway_host, nil, :port => '24')
|
983
1185
|
@knife_ec2_create.configure_ssh_gateway("#{gateway_host}:24")
|
984
1186
|
end
|
985
1187
|
|
986
1188
|
it "configures a ssh gateway with the keys specified in the SSH Config" do
|
987
|
-
Net::SSH::Config.
|
988
|
-
Net::SSH::Gateway.
|
1189
|
+
allow(Net::SSH::Config).to receive(:for).and_return({ :keys => ['configuredkey'] })
|
1190
|
+
expect(Net::SSH::Gateway).to receive(:new).with(gateway_host, nil, :port => 22, :keys => ['configuredkey'])
|
989
1191
|
@knife_ec2_create.configure_ssh_gateway(gateway_host)
|
990
1192
|
end
|
991
1193
|
|
992
1194
|
it "configures the ssh gateway with the key specified on the knife config / command line" do
|
993
1195
|
@knife_ec2_create.config[:ssh_gateway_identity] = "/home/fireman/.ssh/gateway.pem"
|
994
1196
|
#Net::SSH::Config.stub(:for).and_return({ :keys => ['configuredkey'] })
|
995
|
-
Net::SSH::Gateway.
|
1197
|
+
expect(Net::SSH::Gateway).to receive(:new).with(gateway_host, nil, :port => 22, :keys => ['/home/fireman/.ssh/gateway.pem'])
|
996
1198
|
@knife_ec2_create.configure_ssh_gateway(gateway_host)
|
997
1199
|
end
|
998
1200
|
|
999
1201
|
it "prefers the knife config over the ssh config for the gateway keys" do
|
1000
1202
|
@knife_ec2_create.config[:ssh_gateway_identity] = "/home/fireman/.ssh/gateway.pem"
|
1001
|
-
Net::SSH::Config.
|
1002
|
-
Net::SSH::Gateway.
|
1203
|
+
allow(Net::SSH::Config).to receive(:for).and_return({ :keys => ['not_this_key_dude'] })
|
1204
|
+
expect(Net::SSH::Gateway).to receive(:new).with(gateway_host, nil, :port => 22, :keys => ['/home/fireman/.ssh/gateway.pem'])
|
1003
1205
|
@knife_ec2_create.configure_ssh_gateway(gateway_host)
|
1004
1206
|
end
|
1005
1207
|
end
|
@@ -1008,24 +1210,24 @@ describe Chef::Knife::Ec2ServerCreate do
|
|
1008
1210
|
# Normally we would only get the header after we send a client header, e.g. 'SSH-2.0-client'
|
1009
1211
|
it "should return true if we get an ssh header" do
|
1010
1212
|
@knife_ec2_create = Chef::Knife::Ec2ServerCreate.new
|
1011
|
-
TCPSocket.
|
1012
|
-
IO.
|
1013
|
-
@knife_ec2_create.
|
1213
|
+
allow(TCPSocket).to receive(:new).and_return(StringIO.new("SSH-2.0-OpenSSH_6.1p1 Debian-4"))
|
1214
|
+
allow(IO).to receive(:select).and_return(true)
|
1215
|
+
expect(@knife_ec2_create).to receive(:tcp_test_ssh).and_yield.and_return(true)
|
1014
1216
|
@knife_ec2_create.tcp_test_ssh("blackhole.ninja", 22) {nil}
|
1015
1217
|
end
|
1016
1218
|
|
1017
1219
|
it "should return false if we do not get an ssh header" do
|
1018
1220
|
@knife_ec2_create = Chef::Knife::Ec2ServerCreate.new
|
1019
|
-
TCPSocket.
|
1020
|
-
IO.
|
1021
|
-
@knife_ec2_create.tcp_test_ssh("blackhole.ninja", 22).
|
1221
|
+
allow(TCPSocket).to receive(:new).and_return(StringIO.new(""))
|
1222
|
+
allow(IO).to receive(:select).and_return(true)
|
1223
|
+
expect(@knife_ec2_create.tcp_test_ssh("blackhole.ninja", 22)).to be_falsey
|
1022
1224
|
end
|
1023
1225
|
|
1024
1226
|
it "should return false if the socket isn't ready" do
|
1025
1227
|
@knife_ec2_create = Chef::Knife::Ec2ServerCreate.new
|
1026
|
-
TCPSocket.
|
1027
|
-
IO.
|
1028
|
-
@knife_ec2_create.tcp_test_ssh("blackhole.ninja", 22).
|
1228
|
+
allow(TCPSocket).to receive(:new)
|
1229
|
+
allow(IO).to receive(:select).and_return(false)
|
1230
|
+
expect(@knife_ec2_create.tcp_test_ssh("blackhole.ninja", 22)).to be_falsey
|
1029
1231
|
end
|
1030
1232
|
end
|
1031
1233
|
end
|