kitchen-rackspace 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c6469e67fffc7ea57b835b40acdee063915b1e4f
4
- data.tar.gz: 0d68de2a3c6855dc93ab3d8901692c7f86e8e94e
3
+ metadata.gz: e320297bfe8e683d298155da6bf1864c420b3691
4
+ data.tar.gz: 633656517754c67fc5aa1f466f0e6a4430552d37
5
5
  SHA512:
6
- metadata.gz: b0d461f568bb73502343717b8cf6c6fff0c94b6401b5e12040111a2a281fbbfab373992e3bfe79ed783aac82982e66232b70dc9ebf72af85c9758e9833cb7249
7
- data.tar.gz: 136be154ad4f08c62986760a1fb35039ac64f1c7c6f0ccbbe22358a82b1fff4a92304c36a30fb614f9448264b121b8cee2e2df1ae3ee28df83009bc2c798fca5
6
+ metadata.gz: 14d8e600b6b7eff9799fc3e084552528688cbe88d8033b5e4e2e518b8049b3e95866e93cfd4898475ad9cbb31f3f5173109113b8e090e8f63b9c2a9873ce051d
7
+ data.tar.gz: a6c176366ffea6994bd71d252d5deb92743e711a3e64135867b5fde52734e67b670b4c13d92a15fe1074babf9be50f8df65d6d49ac2355d923fa6cd527f36f51
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ # 0.7.0 / 2014-07-09
2
+
3
+ ### New Features
4
+
5
+ * PR [#31][] - Support attaching to custom networks, via [@kanerogers][]
6
+ * PR [#29][] - Support using a sleep instead of TCP check in cases where new
7
+ servers might fail the TCP; via [@martinb3][]
8
+
1
9
  # 0.6.1 / 2014-06-03
2
10
 
3
11
  ### Bug Fixes
@@ -62,6 +70,8 @@ boot times, via [@coderanger][]
62
70
 
63
71
  * Initial release! Woo!
64
72
 
73
+ [#31]: https://github.com/test-kitchen/kitchen-rackspace/pull/31
74
+ [#29]: https://github.com/test-kitchen/kitchen-rackspace/pull/29
65
75
  [#26]: https://github.com/test-kitchen/kitchen-rackspace/pull/26
66
76
  [#25]: https://github.com/test-kitchen/kitchen-rackspace/pull/25
67
77
  [#24]: https://github.com/test-kitchen/kitchen-rackspace/pull/24
@@ -74,6 +84,8 @@ boot times, via [@coderanger][]
74
84
  [#8]: https://github.com/test-kitchen/kitchen-rackspace/pull/8
75
85
  [#7]: https://github.com/test-kitchen/kitchen-rackspace/pull/7
76
86
 
87
+ [@kanerogers]: https://github.com/kanerogers
88
+ [@martinb3]: https://github.com/martinb3
77
89
  [@pezholio]: https://github.com/pezholio
78
90
  [@coderanger]: https://github.com/coderanger
79
91
  [@claco]: https://github.com/claco
data/README.md CHANGED
@@ -33,7 +33,7 @@ Provide, at a minimum, the required driver options in your `.kitchen.yml` file:
33
33
  name: rackspace
34
34
  rackspace_username: [YOUR RACKSPACE CLOUD USERNAME]
35
35
  rackspace_api_key: [YOUR RACKSPACE CLOUD API KEY]
36
- require_chef_omnibus: latest (if you'll be using Chef)
36
+ require_chef_omnibus: [e.g. 'true' or a version number if you need Chef]
37
37
  platforms:
38
38
  - name: [A PLATFORM NAME, e.g. 'centos-6']
39
39
 
@@ -46,12 +46,22 @@ for your specified platform. Additional, optional overrides can be provided:
46
46
  public_key_path: [PATH TO YOUR PUBLIC SSH KEY]
47
47
  rackspace_region: [A VALID RACKSPACE DC/REGION]
48
48
  wait_for: [NUM OF SECONDS TO WAIT BEFORE TIMING OUT, DEFAULT 600]
49
+ no_ssh_tcp_check: [DEFAULTS TO false, SKIPS TCP CHECK WHEN true]
50
+ no_ssh_tcp_check_sleep: [NUM OF SECONDS TO SLEEP IF no_ssh_tcp_check IS SET]
51
+ networks: [LIST OF RACKSPACE NETWORK UUIDS, DEFAULT PUBLICNET AND SERVICE NET]
49
52
 
50
53
  You also have the option of providing some configs via environment variables:
51
54
 
52
55
  export RACKSPACE_USERNAME="user" # (or OS_USERNAME)
53
56
  export RACKSPACE_API_KEY="api_key" # (or OS_PASSWORD)
54
57
 
58
+ Some configs are also derived based on your .ssh directory, specifically the
59
+ `public_key_path` setting is derived by searching for:
60
+ - `~/.ssh/id_rsa.pub`
61
+ - `~/.ssh/id_dsa.pub`
62
+ - `~/.ssh/identity.pub`
63
+ - `~/.ssh/id_ecdsa.pub`
64
+
55
65
  ## Contributing
56
66
 
57
67
  1. Fork it
@@ -34,14 +34,11 @@ module Kitchen
34
34
  default_config :port, '22'
35
35
  default_config :rackspace_region, 'dfw'
36
36
  default_config :wait_for, 600
37
-
38
- default_config :image_id do |driver|
39
- driver.default_image
40
- end
41
-
42
- default_config :server_name do |driver|
43
- driver.default_name
44
- end
37
+ default_config :no_ssh_tcp_check, false
38
+ default_config :no_ssh_tcp_check_sleep, 120
39
+ default_config(:image_id) { |driver| driver.default_image }
40
+ default_config(:server_name) { |driver| driver.default_name }
41
+ default_config :networks, nil
45
42
 
46
43
  default_config :public_key_path do
47
44
  [
@@ -77,8 +74,7 @@ module Kitchen
77
74
  server.wait_for { ready? }
78
75
  puts '(server ready)'
79
76
  state[:hostname] = server.public_ip_address
80
- wait_for_sshd(state[:hostname])
81
- puts '(ssh ready)'
77
+ tcp_check(state)
82
78
  rescue Fog::Errors::Error, Excon::Errors::Error => ex
83
79
  raise ActionFailed, ex.message
84
80
  end
@@ -106,36 +102,45 @@ module Kitchen
106
102
  private
107
103
 
108
104
  def compute
109
- server_def = {
110
- provider: 'Rackspace',
111
- version: config[:version],
112
- rackspace_username: config[:rackspace_username],
113
- rackspace_api_key: config[:rackspace_api_key]
114
- }
115
- if config[:rackspace_region]
116
- server_def[:rackspace_region] = config[:rackspace_region]
105
+ server_def = { provider: 'Rackspace' }
106
+ opts = [:version, :rackspace_username, :rackspace_api_key,
107
+ :rackspace_region]
108
+ opts.each do |opt|
109
+ server_def[opt] = config[opt]
117
110
  end
118
111
  Fog::Compute.new(server_def)
119
112
  end
120
113
 
121
114
  def create_server
122
- compute.servers.bootstrap(
123
- name: config[:server_name],
124
- image_id: config[:image_id],
125
- flavor_id: config[:flavor_id],
126
- public_key_path: config[:public_key_path]
127
- )
115
+ server_def = { name: config[:server_name], networks: networks }
116
+ [:image_id, :flavor_id, :public_key_path].each do |opt|
117
+ server_def[opt] = config[opt]
118
+ end
119
+ compute.servers.bootstrap(server_def)
128
120
  end
129
121
 
130
122
  def images
131
123
  @images ||= begin
132
- json_file = File.expand_path(
133
- File.join(%w(.. .. .. .. data images.json)),
134
- __FILE__
135
- )
124
+ json_file = File.expand_path('../../../../data/images.json', __FILE__)
136
125
  JSON.load(IO.read(json_file))
137
126
  end
138
127
  end
128
+
129
+ def tcp_check(state)
130
+ # allow driver config to bypass SSH tcp check -- because
131
+ # it doesn't respect ssh_config values that might be required
132
+ wait_for_sshd(state[:hostname]) unless config[:no_ssh_tcp_check]
133
+ sleep(config[:no_ssh_tcp_check_sleep]) if config[:no_ssh_tcp_check]
134
+ puts '(ssh ready)'
135
+ end
136
+
137
+ def networks
138
+ base_nets = %w(
139
+ 00000000-0000-0000-0000-000000000000
140
+ 11111111-1111-1111-1111-111111111111
141
+ )
142
+ config[:networks] ? base_nets + config[:networks] : nil
143
+ end
139
144
  end
140
145
  end
141
146
  end
@@ -21,6 +21,6 @@ module Kitchen
21
21
  #
22
22
  # @author Jonathan Hartman <j@p4nt5.com>
23
23
  module Driver
24
- RACKSPACE_VERSION = '0.6.1'
24
+ RACKSPACE_VERSION = '0.7.0'
25
25
  end
26
26
  end
@@ -29,6 +29,7 @@ describe Kitchen::Driver::Rackspace do
29
29
  let(:config) { Hash.new }
30
30
  let(:state) { Hash.new }
31
31
  let(:platform_name) { 'ubuntu' }
32
+ let(:default_networks) { nil }
32
33
 
33
34
  let(:instance) do
34
35
  double(
@@ -95,6 +96,18 @@ describe Kitchen::Driver::Rackspace do
95
96
  expect(driver[:wait_for]).to eq(600)
96
97
  expect(Fog).to have_received(:timeout=).with(600)
97
98
  end
99
+
100
+ it 'defaults the SSH TCP bypassing to false' do
101
+ expect(driver[:no_ssh_tcp_check]).to eq(false)
102
+ end
103
+
104
+ it 'defaults the TCP bypass sleep time to 120 seconds' do
105
+ expect(driver[:no_ssh_tcp_check_sleep]).to eq(120)
106
+ end
107
+
108
+ it 'defaults to the standard Rackspace networks' do
109
+ expect(driver[:networks]).to eq(default_networks)
110
+ end
98
111
  end
99
112
 
100
113
  platforms = {
@@ -161,7 +174,8 @@ describe Kitchen::Driver::Rackspace do
161
174
 
162
175
  describe '#create' do
163
176
  let(:server) do
164
- double(id: 'test123', wait_for: true,
177
+ double(id: 'test123',
178
+ wait_for: true,
165
179
  public_ip_address: '1.2.3.4')
166
180
  end
167
181
  let(:driver) do
@@ -170,7 +184,7 @@ describe Kitchen::Driver::Rackspace do
170
184
  d.instance = instance
171
185
  allow(d).to receive(:default_name).and_return('a_monkey!')
172
186
  allow(d).to receive(:create_server).and_return(server)
173
- allow(d).to receive(:wait_for_sshd).with('1.2.3.4').and_return(true)
187
+ allow(d).to receive(:tcp_check).and_return(true)
174
188
  d
175
189
  end
176
190
 
@@ -197,7 +211,13 @@ describe Kitchen::Driver::Rackspace do
197
211
  driver.create(state)
198
212
  expect(state[:hostname]).to eq('1.2.3.4')
199
213
  end
214
+
215
+ it 'calls tcp_check' do
216
+ expect(driver).to receive(:tcp_check)
217
+ driver.create(state)
218
+ end
200
219
  end
220
+
201
221
  end
202
222
 
203
223
  describe '#destroy' do
@@ -299,7 +319,8 @@ describe Kitchen::Driver::Rackspace do
299
319
  server_name: 'hello',
300
320
  image_id: 'there',
301
321
  flavor_id: 'captain',
302
- public_key_path: 'tarpals'
322
+ public_key_path: 'tarpals',
323
+ networks: default_networks
303
324
  }
304
325
  end
305
326
  before(:each) do
@@ -324,6 +345,40 @@ describe Kitchen::Driver::Rackspace do
324
345
  it 'creates the server using a compute connection' do
325
346
  expect(driver.send(:create_server)).to eq(@expected)
326
347
  end
348
+
349
+ context 'additional networks specified' do
350
+ let(:server_id) { '12345' }
351
+ let(:server) do
352
+ double(id: 'test123', wait_for: true,
353
+ public_ip_address: '1.2.3.4')
354
+ end
355
+ let(:hostname) { 'example.com' }
356
+ let(:servers_double) { double('servers', bootstrap: server) }
357
+ let(:compute_double) { double(Fog::Compute, servers: servers_double) }
358
+ let(:state) { { server_id: server_id, hostname: hostname } }
359
+ let(:driver) do
360
+ d = Kitchen::Driver::Rackspace.new(config)
361
+ allow(d).to receive(:wait_for_sshd).with('1.2.3.4').and_return(true)
362
+ d.instance = instance
363
+ allow(Fog::Compute).to receive(:new).and_return(compute_double)
364
+ d
365
+ end
366
+ let(:user_specified_network) { 'bob_dole' }
367
+ let(:config) do
368
+ {
369
+ rackspace_username: 'monkey',
370
+ rackspace_api_key: 'potato',
371
+ rackspace_region: 'ord',
372
+ networks: [user_specified_network]
373
+ }
374
+ end
375
+ it 'has the user specified network, plus default Rackspace networks' do
376
+ driver.create(state)
377
+ expect(servers_double).to have_received(:bootstrap) do |arg|
378
+ expect(arg[:networks][2]).to eq user_specified_network
379
+ end
380
+ end
381
+ end
327
382
  end
328
383
 
329
384
  describe '#default_name' do
@@ -337,4 +392,50 @@ describe Kitchen::Driver::Rackspace do
337
392
  /^potatoes-user-host-/)
338
393
  end
339
394
  end
395
+
396
+ describe '#tcp_check' do
397
+ before(:each) do
398
+ allow_any_instance_of(described_class).to receive(:wait_for_sshd)
399
+ allow_any_instance_of(described_class).to receive(:sleep)
400
+ end
401
+
402
+ context 'the default non-skipping behavior' do
403
+ it "uses Kitchen's own SSH check" do
404
+ expect(driver).to receive(:wait_for_sshd)
405
+ expect(driver).to_not receive(:sleep)
406
+ driver.send(:tcp_check, state)
407
+ end
408
+ end
409
+
410
+ context 'a config set to wait instead of TCP check' do
411
+ let(:config) { { no_ssh_tcp_check: true } }
412
+
413
+ it 'uses a sleep instead of a port check' do
414
+ expect(driver).to_not receive(:wait_for_sshd)
415
+ expect(driver).to receive(:sleep)
416
+ driver.send(:tcp_check, state)
417
+ end
418
+ end
419
+ end
420
+
421
+ describe '#networks' do
422
+ context 'the default Rackspace networks' do
423
+ it 'returns nil so Fog will use the defaults' do
424
+ expect(driver.send(:networks)).to eq(nil)
425
+ end
426
+ end
427
+
428
+ context 'a custom Rackspace network' do
429
+ let(:config) { { networks: %w(abcdefg) } }
430
+
431
+ it 'returns the base networks plus the custom one' do
432
+ expected = %w(
433
+ 00000000-0000-0000-0000-000000000000
434
+ 11111111-1111-1111-1111-111111111111
435
+ abcdefg
436
+ )
437
+ expect(driver.send(:networks)).to eq(expected)
438
+ end
439
+ end
440
+ end
340
441
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitchen-rackspace
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Hartman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-03 00:00:00.000000000 Z
11
+ date: 2014-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-kitchen