kitchen-gce 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +11 -0
- data/CHANGELOG.md +8 -0
- data/README.md +16 -11
- data/kitchen-gce.gemspec +2 -2
- data/lib/kitchen/driver/gce.rb +15 -6
- data/spec/kitchen/driver/gce_spec.rb +101 -17
- metadata +4 -5
data/.rubocop.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
inherit_from: .rubocop_todo.yml
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# This configuration was generated by `rubocop --auto-gen-config`
|
2
|
+
# on 2014-09-20 08:00:47 -0700 using RuboCop version 0.26.0.
|
3
|
+
# The point is for the user to remove these configuration records
|
4
|
+
# one by one as the offenses are removed from the code base.
|
5
|
+
# Note that changes in the inspected code, or installation of new
|
6
|
+
# versions of RuboCop, may require this file to be generated again.
|
7
|
+
|
8
|
+
# Offense count: 1
|
9
|
+
# Configuration parameters: CountComments.
|
10
|
+
Metrics/ClassLength:
|
11
|
+
Max: 102
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -49,16 +49,10 @@ Then, execute `bundle install`.
|
|
49
49
|
|
50
50
|
## Configuration
|
51
51
|
|
52
|
-
### area
|
52
|
+
### area
|
53
53
|
|
54
|
-
|
55
|
-
"
|
56
|
-
availability zone's name; e.g. in "us-central1-b", the area is "us".
|
57
|
-
Specifying area but not "zone_name" allows kitchen-gce to avoid
|
58
|
-
launching instances into a zone that is down for maintenance. If
|
59
|
-
"any" is specified, kitchen-gce will select a zone from all areas.
|
60
|
-
Default: `us` (lowest cost area); valid values: `any`, `asia`,
|
61
|
-
`europe`, `us`
|
54
|
+
(Deprecated - use equivalent "region" instead. If both "area" and
|
55
|
+
"region" are set, the value of "region" will be used.)
|
62
56
|
|
63
57
|
### autodelete_disk
|
64
58
|
|
@@ -110,6 +104,17 @@ GCE network that instance will be attached to; default: `default`
|
|
110
104
|
Path to the public half of the ssh key that will be deployed to
|
111
105
|
`~username/.ssh/authorized_keys`; see also "username" below.
|
112
106
|
|
107
|
+
### region
|
108
|
+
|
109
|
+
Region in which to launch instances. "Region" is defined as the part
|
110
|
+
prior to the second hyphen in an availability zone's name; e.g. in
|
111
|
+
"us-central1-b", the region is "us-central1". Specifying region but
|
112
|
+
not "zone_name" allows kitchen-gce to avoid launching instances into a
|
113
|
+
zone that is down for maintenance. If "any" is specified, kitchen-gce
|
114
|
+
will select a zone from all regions. Default: `us-central1` (lowest
|
115
|
+
cost region); valid values: `any`, `asia-east1`, `europe-west1`,
|
116
|
+
`us-central1`
|
117
|
+
|
113
118
|
### tags
|
114
119
|
|
115
120
|
Array of tags to associate with instance; default: `[]`
|
@@ -121,7 +126,7 @@ Username test-kitchen will log into instance as; default: `ENV['USER']`
|
|
121
126
|
### zone_name
|
122
127
|
|
123
128
|
Location into which instances will be launched. If not specified, a
|
124
|
-
zone is chosen from available zones within the "
|
129
|
+
zone is chosen from available zones within the "region" (see above).
|
125
130
|
|
126
131
|
## Example
|
127
132
|
|
@@ -132,11 +137,11 @@ like this:
|
|
132
137
|
---
|
133
138
|
driver_plugin: gce
|
134
139
|
driver_config:
|
135
|
-
area: any
|
136
140
|
google_client_email: "123456789012@developer.gserviceaccount.com"
|
137
141
|
google_key_location: "<%= ENV['HOME']%>/gce/1234567890abcdef1234567890abcdef12345678-privatekey.p12"
|
138
142
|
google_project: "alpha-bravo-123"
|
139
143
|
network: "kitchenci"
|
144
|
+
region: any
|
140
145
|
|
141
146
|
platforms:
|
142
147
|
- name: debian-7
|
data/kitchen-gce.gemspec
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
Gem::Specification.new do |s|
|
3
3
|
s.name = 'kitchen-gce'
|
4
|
-
s.version = '0.
|
5
|
-
s.date = '2014-
|
4
|
+
s.version = '0.2.0'
|
5
|
+
s.date = '2014-09-20'
|
6
6
|
s.summary = 'Kitchen::Driver::Gce'
|
7
7
|
s.description = 'A Test-Kitchen driver for Google Compute Engine'
|
8
8
|
s.authors = ['Andrew Leonard']
|
data/lib/kitchen/driver/gce.rb
CHANGED
@@ -27,7 +27,7 @@ module Kitchen
|
|
27
27
|
#
|
28
28
|
# @author Andrew Leonard <andy@hurricane-ridge.com>
|
29
29
|
class Gce < Kitchen::Driver::SSHBase
|
30
|
-
default_config :area, 'us'
|
30
|
+
default_config :area, 'us-central1'
|
31
31
|
default_config :autodelete_disk, true
|
32
32
|
default_config :disk_size, 10
|
33
33
|
default_config :machine_type, 'n1-standard-1'
|
@@ -90,6 +90,8 @@ module Kitchen
|
|
90
90
|
end
|
91
91
|
|
92
92
|
def create_instance
|
93
|
+
config[:region] ||= config[:area]
|
94
|
+
|
93
95
|
config[:inst_name] ||= generate_inst_name
|
94
96
|
config[:zone_name] ||= select_zone
|
95
97
|
|
@@ -112,20 +114,27 @@ module Kitchen
|
|
112
114
|
|
113
115
|
def generate_inst_name
|
114
116
|
# Inspired by generate_name from kitchen-rackspace
|
115
|
-
|
116
|
-
|
117
|
+
name = instance.name.downcase
|
118
|
+
name.gsub!(/([^-a-z0-9])/, '-')
|
119
|
+
name = 't' + name unless name =~ /^[a-z]/
|
120
|
+
base_name = name[0..25] # UUID is 36 chars, max name length 63
|
121
|
+
gen_name = "#{base_name}-#{SecureRandom.uuid}"
|
122
|
+
unless gen_name =~ /^[a-z]([-a-z0-9]*[a-z0-9])?$/
|
123
|
+
fail "Invalid generated instance name: #{gen_name}"
|
124
|
+
end
|
125
|
+
gen_name
|
117
126
|
end
|
118
127
|
|
119
128
|
def select_zone
|
120
|
-
if config[:
|
129
|
+
if config[:region] == 'any'
|
121
130
|
zone_regexp = /^[a-z]+\-/
|
122
131
|
else
|
123
|
-
zone_regexp = /^#{config[:
|
132
|
+
zone_regexp = /^#{config[:region]}\-/
|
124
133
|
end
|
125
134
|
zones = connection.zones.select do |z|
|
126
135
|
z.status == 'UP' && z.name.match(zone_regexp)
|
127
136
|
end
|
128
|
-
fail 'No up zones in
|
137
|
+
fail 'No up zones in region' unless zones.length >= 1
|
129
138
|
zones.sample.name
|
130
139
|
end
|
131
140
|
|
@@ -44,7 +44,7 @@ describe Kitchen::Driver::Gce do
|
|
44
44
|
let(:driver) do
|
45
45
|
d = Kitchen::Driver::Gce.new(config)
|
46
46
|
d.instance = instance
|
47
|
-
d.
|
47
|
+
allow(d).to receive(:wait_for_sshd) { true }
|
48
48
|
d
|
49
49
|
end
|
50
50
|
|
@@ -57,7 +57,7 @@ describe Kitchen::Driver::Gce do
|
|
57
57
|
name: 'rspec-test-disk',
|
58
58
|
size_gb: 10,
|
59
59
|
zone_name: 'us-central1-b',
|
60
|
-
source_image: 'debian-7-wheezy-
|
60
|
+
source_image: 'debian-7-wheezy-v20130816'
|
61
61
|
)
|
62
62
|
end
|
63
63
|
|
@@ -80,12 +80,13 @@ describe Kitchen::Driver::Gce do
|
|
80
80
|
context 'with default options' do
|
81
81
|
|
82
82
|
defaults = {
|
83
|
-
area: 'us',
|
83
|
+
area: 'us-central1',
|
84
84
|
autodelete_disk: true,
|
85
85
|
disk_size: 10,
|
86
86
|
inst_name: nil,
|
87
87
|
machine_type: 'n1-standard-1',
|
88
88
|
network: 'default',
|
89
|
+
region: nil,
|
89
90
|
tags: [],
|
90
91
|
username: ENV['USER'],
|
91
92
|
zone_name: nil }
|
@@ -99,12 +100,13 @@ describe Kitchen::Driver::Gce do
|
|
99
100
|
|
100
101
|
context 'with overriden options' do
|
101
102
|
overrides = {
|
102
|
-
area: 'europe',
|
103
|
+
area: 'europe-west',
|
103
104
|
autodelete_disk: false,
|
104
105
|
disk_size: 15,
|
105
106
|
inst_name: 'ci-instance',
|
106
107
|
machine_type: 'n1-highmem-8',
|
107
108
|
network: 'dev-net',
|
109
|
+
region: 'asia-east1',
|
108
110
|
tags: %w(qa integration),
|
109
111
|
username: 'root',
|
110
112
|
zone_name: 'europe-west1-a'
|
@@ -158,8 +160,8 @@ describe Kitchen::Driver::Gce do
|
|
158
160
|
|
159
161
|
let(:driver) do
|
160
162
|
d = Kitchen::Driver::Gce.new(config)
|
161
|
-
d.
|
162
|
-
d.
|
163
|
+
allow(d).to receive(:create_instance) { server }
|
164
|
+
allow(d).to receive(:wait_for_up_instance) { nil }
|
163
165
|
d
|
164
166
|
end
|
165
167
|
|
@@ -179,7 +181,7 @@ describe Kitchen::Driver::Gce do
|
|
179
181
|
describe '#create_disk' do
|
180
182
|
context 'with defaults and required options' do
|
181
183
|
it 'returns a Google Disk object' do
|
182
|
-
config[:image_name] = 'debian-7-wheezy-
|
184
|
+
config[:image_name] = 'debian-7-wheezy-v20130816'
|
183
185
|
config[:inst_name] = 'rspec-disk'
|
184
186
|
config[:zone_name] = 'us-central1-a'
|
185
187
|
expect(driver.send(:create_disk)).to be_a(Fog::Compute::Google::Disk)
|
@@ -200,6 +202,43 @@ describe Kitchen::Driver::Gce do
|
|
200
202
|
expect(driver.send(:create_instance)).to be_a(
|
201
203
|
Fog::Compute::Google::Server)
|
202
204
|
end
|
205
|
+
|
206
|
+
it 'sets the region to the default "us-central1"' do
|
207
|
+
driver.send(:create_instance)
|
208
|
+
expect(config[:region]).to eq('us-central1')
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
context 'area set, region unset' do
|
213
|
+
let(:config) do
|
214
|
+
{ area: 'europe-west1',
|
215
|
+
google_client_email: '123456789012@developer.gserviceaccount.com',
|
216
|
+
google_key_location: '/home/user/gce/123456-privatekey.p12',
|
217
|
+
google_project: 'alpha-bravo-123'
|
218
|
+
}
|
219
|
+
end
|
220
|
+
|
221
|
+
it 'sets region to the area value' do
|
222
|
+
driver.send(:create_instance)
|
223
|
+
expect(config[:region]).to eq(config[:area])
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
context 'area set, region set' do
|
228
|
+
let(:config) do
|
229
|
+
{ area: 'fugazi',
|
230
|
+
google_client_email: '123456789012@developer.gserviceaccount.com',
|
231
|
+
google_key_location: '/home/user/gce/123456-privatekey.p12',
|
232
|
+
google_project: 'alpha-bravo-123',
|
233
|
+
region: 'europe-west1'
|
234
|
+
}
|
235
|
+
end
|
236
|
+
|
237
|
+
it 'sets the region independent of the area value' do
|
238
|
+
driver.send(:create_instance)
|
239
|
+
expect(config[:region]).to eq('europe-west1')
|
240
|
+
end
|
241
|
+
|
203
242
|
end
|
204
243
|
end
|
205
244
|
|
@@ -239,23 +278,60 @@ describe Kitchen::Driver::Gce do
|
|
239
278
|
end
|
240
279
|
end
|
241
280
|
|
242
|
-
context 'with a name
|
281
|
+
context 'with a name 27 characters or longer' do
|
243
282
|
let(:instance) do
|
244
|
-
double(name: '
|
283
|
+
double(name: 'a23456789012345678901234567')
|
245
284
|
end
|
246
285
|
|
247
286
|
it 'shortens the base name and appends a UUID' do
|
287
|
+
expect(driver.send(:generate_inst_name).length).to eq 63
|
248
288
|
expect(driver.send(:generate_inst_name)).to match(
|
249
|
-
/^
|
289
|
+
/^a2345678901234567890123456
|
290
|
+
-[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$/x)
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
context 'with a "name" value containing an invalid leading character' do
|
295
|
+
let(:instance) do
|
296
|
+
double(name: '12345')
|
297
|
+
end
|
298
|
+
|
299
|
+
it 'adds a leading "t"' do
|
300
|
+
expect(driver.send(:generate_inst_name)).to match(
|
301
|
+
/^t12345
|
302
|
+
-[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$/x)
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
context 'with a "name" value containing uppercase letters' do
|
307
|
+
let(:instance) do
|
308
|
+
double(name: 'AbCdEf')
|
309
|
+
end
|
310
|
+
|
311
|
+
it 'downcases the "name" characters in the instance name' do
|
312
|
+
expect(driver.send(:generate_inst_name)).to match(
|
313
|
+
/^abcdef
|
314
|
+
-[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$/x)
|
315
|
+
end
|
316
|
+
end
|
317
|
+
|
318
|
+
context 'with a name value containing invalid characters' do
|
319
|
+
let(:instance) do
|
320
|
+
double(name: 'a!b@c#d$e%f^g&h*i(j)')
|
321
|
+
end
|
322
|
+
|
323
|
+
it 'replaces the invalid characters with dashes' do
|
324
|
+
expect(driver.send(:generate_inst_name)).to match(
|
325
|
+
/^a-b-c-d-e-f-g-h-i-j-
|
250
326
|
-[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$/x)
|
251
327
|
end
|
252
328
|
end
|
253
329
|
end
|
254
330
|
|
255
331
|
describe '#select_zone' do
|
256
|
-
context 'when choosing from any
|
332
|
+
context 'when choosing from any region' do
|
257
333
|
let(:config) do
|
258
|
-
{
|
334
|
+
{ region: 'any',
|
259
335
|
google_client_email: '123456789012@developer.gserviceaccount.com',
|
260
336
|
google_key_location: '/home/user/gce/123456-privatekey.p12',
|
261
337
|
google_project: 'alpha-bravo-123'
|
@@ -270,24 +346,32 @@ describe Kitchen::Driver::Gce do
|
|
270
346
|
end
|
271
347
|
end
|
272
348
|
|
273
|
-
context 'when choosing from the "europe"
|
349
|
+
context 'when choosing from the "europe-west1" region' do
|
274
350
|
let(:config) do
|
275
|
-
{
|
351
|
+
{ region: 'europe-west1',
|
276
352
|
google_client_email: '123456789012@developer.gserviceaccount.com',
|
277
353
|
google_key_location: '/home/user/gce/123456-privatekey.p12',
|
278
354
|
google_project: 'alpha-bravo-123'
|
279
355
|
}
|
280
356
|
end
|
281
357
|
|
282
|
-
it 'chooses a zone in europe' do
|
358
|
+
it 'chooses a zone in europe-west1' do
|
283
359
|
expect(driver.send(:select_zone)).to satisfy do |zone|
|
284
360
|
%w(europe-west1-a).include?(zone)
|
285
361
|
end
|
286
362
|
end
|
287
363
|
end
|
288
364
|
|
289
|
-
context 'when choosing from the default "us"
|
290
|
-
|
365
|
+
context 'when choosing from the default "us-central1" region' do
|
366
|
+
let(:config) do
|
367
|
+
{ region: 'us-central1',
|
368
|
+
google_client_email: '123456789012@developer.gserviceaccount.com',
|
369
|
+
google_key_location: '/home/user/gce/123456-privatekey.p12',
|
370
|
+
google_project: 'alpha-bravo-123'
|
371
|
+
}
|
372
|
+
end
|
373
|
+
|
374
|
+
it 'chooses a zone in us-central1' do
|
291
375
|
expect(driver.send(:select_zone)).to satisfy do |zone|
|
292
376
|
%w(us-central1-a us-central1-b us-central2-a).include?(zone)
|
293
377
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kitchen-gce
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-09-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fog
|
@@ -162,6 +162,8 @@ extensions: []
|
|
162
162
|
extra_rdoc_files: []
|
163
163
|
files:
|
164
164
|
- .gitignore
|
165
|
+
- .rubocop.yml
|
166
|
+
- .rubocop_todo.yml
|
165
167
|
- .travis.yml
|
166
168
|
- CHANGELOG.md
|
167
169
|
- Gemfile
|
@@ -191,9 +193,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
191
193
|
- - ! '>='
|
192
194
|
- !ruby/object:Gem::Version
|
193
195
|
version: '0'
|
194
|
-
segments:
|
195
|
-
- 0
|
196
|
-
hash: 2668834953209194821
|
197
196
|
requirements: []
|
198
197
|
rubyforge_project:
|
199
198
|
rubygems_version: 1.8.23.2
|