kitchen-gce 0.1.2 → 0.2.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.
- 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
|