kitchen-google 1.5.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/kitchen/driver/gce.rb +46 -26
- data/lib/kitchen/driver/gce_version.rb +2 -2
- metadata +19 -39
- data/.gitignore +0 -5
- data/.rubocop.yml +0 -1
- data/.rubocop_todo.yml +0 -11
- data/.travis.yml +0 -11
- data/CHANGELOG.md +0 -153
- data/Gemfile +0 -6
- data/README.md +0 -446
- data/Rakefile +0 -14
- data/kitchen-google.gemspec +0 -29
- data/spec/kitchen/driver/gce_spec.rb +0 -1278
- data/spec/spec_helper.rb +0 -21
data/Gemfile
DELETED
data/README.md
DELETED
@@ -1,446 +0,0 @@
|
|
1
|
-
# Kitchen::Gce - A Test Kitchen Driver for Google Compute Engine
|
2
|
-
|
3
|
-
[![Build Status](https://travis-ci.org/test-kitchen/kitchen-google.png?branch=master)](https://travis-ci.org/test-kitchen/kitchen-google)
|
4
|
-
[![Code Climate](https://codeclimate.com/github/test-kitchen/kitchen-google.png)](https://codeclimate.com/github/test-kitchen/kitchen-google)
|
5
|
-
|
6
|
-
This is a [Test Kitchen](https://github.com/opscode/test-kitchen/)
|
7
|
-
driver for Google Compute Engine. While similar to EC2 and other IaaS
|
8
|
-
providers, GCE has a couple of advantages for Chef cookbook testing:
|
9
|
-
|
10
|
-
* (Subjectively) faster instance launch times; and
|
11
|
-
* Sub-hour billing.
|
12
|
-
|
13
|
-
## Requirements
|
14
|
-
|
15
|
-
### Ruby Version
|
16
|
-
|
17
|
-
Ruby 2.0 or greater.
|
18
|
-
|
19
|
-
### Google Cloud Platform (GCP) Project
|
20
|
-
A [Google Cloud Platform](https://cloud.google.com) account is
|
21
|
-
required. If you do not already have an appropriate "project" in
|
22
|
-
which to run your test-kitchen instances, create one, noting the
|
23
|
-
"project id".
|
24
|
-
|
25
|
-
### Authentication and Authorization
|
26
|
-
|
27
|
-
The [underlying API](https://github.com/google/google-api-ruby-client) this plugin uses relies on the
|
28
|
-
[Google Auth Library](https://github.com/google/google-auth-library-ruby) to handle authentication to the
|
29
|
-
Google Cloud API. The auth library expects that there is a JSON credentials file located at:
|
30
|
-
|
31
|
-
`~/.config/gcloud/application_default_credentials.json`
|
32
|
-
|
33
|
-
The easiest way to create this is to download and install the [Google Cloud SDK](https://cloud.google.com/sdk/) and run the
|
34
|
-
`gcloud auth application-default login` command which will create the credentials file for you.
|
35
|
-
|
36
|
-
If you already have a file you'd like to use that is in a different location, set the
|
37
|
-
`GOOGLE_APPLICATION_CREDENTIALS` environment variable with the full path to that file.
|
38
|
-
|
39
|
-
### SSH Keys
|
40
|
-
|
41
|
-
#### Project Level Keys
|
42
|
-
|
43
|
-
In order to bootstrap Linux nodes, you will first need to ensure your SSH
|
44
|
-
keys are set up correctly. Ensure your SSH public key is properly entered
|
45
|
-
into your project's Metadata tab in the GCP Console. GCE will add your key
|
46
|
-
to the appropriate user's `~/.ssh/authorized_keys` file when Chef first
|
47
|
-
connects to perform the bootstrap process.
|
48
|
-
|
49
|
-
* If you don't have one, create a key using `ssh-keygen`
|
50
|
-
* Log in to the GCP console, select your project, go to Compute Engine, and go to the Metadata tab.
|
51
|
-
* Select the "SSH Keys" tab.
|
52
|
-
* Add a new item, and paste in your public key.
|
53
|
-
* Note: to change the username automatically detected for the key, prefix your key with the username
|
54
|
-
you plan to use to connect to a new instance. For example, if you plan to connect
|
55
|
-
as "chefuser", your key should look like: `chefuser:ssh-rsa AAAAB3N...`
|
56
|
-
* Click "Save".
|
57
|
-
|
58
|
-
Alternatively, the Google Cloud SDK (a.k.a. `gcloud`) will create a SSH key
|
59
|
-
for you when you create and access your first instance:
|
60
|
-
|
61
|
-
1. Create a small test instance:
|
62
|
-
`gcloud compute instances create instance1 --zone us-central1-f --image-family=debian-8 --image-project=debian-cloud --machine-type g1-small`
|
63
|
-
1. Ensure your SSH keys allow access to the new instance
|
64
|
-
`gcloud compute ssh instance1 --zone us-central1-f`
|
65
|
-
1. Log out and delete the instance
|
66
|
-
`gcloud compute instances delete instance1 --zone us-central1-f`
|
67
|
-
|
68
|
-
You will now have a local SSH keypair, `~/.ssh/google_compute_engine[.pub]` that
|
69
|
-
will be used for connecting to your GCE Linux instances for this local username
|
70
|
-
when you use the `gcloud compute ssh` command. You can tell Test Kitchen to use
|
71
|
-
this key by adding it to the transport section of your .kitchen.yml:
|
72
|
-
|
73
|
-
```yaml
|
74
|
-
transport:
|
75
|
-
ssh_key:
|
76
|
-
- ~/.ssh/google_compute_engine
|
77
|
-
```
|
78
|
-
|
79
|
-
You can find [more information on configuring SSH keys](https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys) in
|
80
|
-
the Google Compute Engine documentation.
|
81
|
-
|
82
|
-
#### Instance Level Keys
|
83
|
-
|
84
|
-
It is possible to [add keys](https://cloud.google.com/compute/docs/storing-retrieving-metadata#default)
|
85
|
-
that are not included in the project's metadata to an instance. Do this by
|
86
|
-
listing additional keys in custom metadata (see below for more about [setting
|
87
|
-
metadata](#metadata)).
|
88
|
-
|
89
|
-
For example, given a workspace that has environment variables set for `USER`
|
90
|
-
(the username to connect as) and `SSH_KEY` (the path to the private key to use):
|
91
|
-
|
92
|
-
```yaml
|
93
|
-
driver:
|
94
|
-
name: gce
|
95
|
-
...
|
96
|
-
metadata:
|
97
|
-
ssh-keys: <%= ENV['USER'] + ':' + IO.binread("#{ENV['SSH_KEY']}.pub").rstrip! %>
|
98
|
-
|
99
|
-
transport:
|
100
|
-
username: <%= ENV['USER'] %>
|
101
|
-
ssh_key: <%= ENV['SSH_KEY'] %>
|
102
|
-
```
|
103
|
-
|
104
|
-
## Installation
|
105
|
-
|
106
|
-
Install the gem with:
|
107
|
-
|
108
|
-
```sh
|
109
|
-
gem install kitchen-google
|
110
|
-
```
|
111
|
-
|
112
|
-
Or, even better, if you're using the ChefDK:
|
113
|
-
|
114
|
-
```sh
|
115
|
-
chef gem install kitchen-google
|
116
|
-
```
|
117
|
-
|
118
|
-
If you're using Bundler, simply add it to your Gemfile:
|
119
|
-
|
120
|
-
```ruby
|
121
|
-
gem "kitchen-google", "~> 1.0"
|
122
|
-
```
|
123
|
-
|
124
|
-
... and then run `bundle install`.
|
125
|
-
|
126
|
-
|
127
|
-
## Configuration
|
128
|
-
|
129
|
-
### `project`
|
130
|
-
|
131
|
-
**Required**. The project ID of the GCP project into which Test Kitchen
|
132
|
-
instances will be launched. This can be found on the "Manage All Projects"
|
133
|
-
screen, found under the "Select a Project" drop-down at the top of the
|
134
|
-
GCP console.
|
135
|
-
|
136
|
-
Note that this parameter requires the "Project ID", not the "Project Name."
|
137
|
-
|
138
|
-
Example: "funky-penguin-12345"
|
139
|
-
|
140
|
-
### `image_project`
|
141
|
-
|
142
|
-
The project ID of the GCP project to search for the configured image or image
|
143
|
-
family. This must be specified to find either public images or your own images
|
144
|
-
that exist in another project.
|
145
|
-
|
146
|
-
Example: "ubuntu-os-cloud"
|
147
|
-
|
148
|
-
### `image_family`
|
149
|
-
|
150
|
-
The family of the image to initialize your boot disk from, the latest
|
151
|
-
non-deprecated image will be used.
|
152
|
-
|
153
|
-
Note that this parameter will be ignored if `image_name` is also specified.
|
154
|
-
|
155
|
-
Example: "ubuntu-1604-lts"
|
156
|
-
|
157
|
-
### `image_name`
|
158
|
-
|
159
|
-
The name of the disk image to use as the source image for the boot disk.
|
160
|
-
|
161
|
-
Example: `centos-7-v20170124`
|
162
|
-
|
163
|
-
This parameter will override `image_family` if they are both specified.
|
164
|
-
|
165
|
-
If `image_project` is not specified, only the GCP project specified in `project`
|
166
|
-
will be searched.
|
167
|
-
|
168
|
-
### `zone`
|
169
|
-
|
170
|
-
**Required if `region` is left blank.** The name of the GCE zone in which to
|
171
|
-
launch your instances.
|
172
|
-
|
173
|
-
Example: `us-east1-b`
|
174
|
-
|
175
|
-
### `region`
|
176
|
-
|
177
|
-
**Required if zone is left blank.** The name of the region in which to
|
178
|
-
launch your instances. A zone in the region will be randomly selected.
|
179
|
-
|
180
|
-
Example: `us-central1`
|
181
|
-
|
182
|
-
This parameter will be ignored if `zone` is specified.
|
183
|
-
|
184
|
-
### `inst_name`
|
185
|
-
|
186
|
-
**Optional** Name to give to instance. If given, must be under 63 characters
|
187
|
-
in length. Any character that is not alphanumeric or a hyphen will be converted
|
188
|
-
to a hyphen. Unlike EC2's "Name" tag, this is used as an instance identifier and
|
189
|
-
must be unique. By default, a unique name will be auto-generated; note that
|
190
|
-
auto-generated names must be used if there is more than one test suite. Default:
|
191
|
-
`tk-<suite>-<platform>-<UUID>`
|
192
|
-
|
193
|
-
### `auto_migrate`
|
194
|
-
|
195
|
-
Boolean specifying whether or not to automatically migrate the instance
|
196
|
-
to a host in the event of host maintenance. Default: `false`
|
197
|
-
|
198
|
-
### `email`
|
199
|
-
|
200
|
-
**Required for Windows instances.** The email address of the
|
201
|
-
currently-logged-in GCP user.
|
202
|
-
|
203
|
-
While the credentials file specified in the Authentication and Authorization
|
204
|
-
section is used for all API interactions, the email address is required when
|
205
|
-
performing the necessary password reset prior to bootstrapping the instance.
|
206
|
-
|
207
|
-
### `machine_type`
|
208
|
-
|
209
|
-
GCE instance type (size) to launch; default: `n1-standard-1`
|
210
|
-
|
211
|
-
### `network`
|
212
|
-
|
213
|
-
GCE network that instance will be attached to; default: `default`
|
214
|
-
|
215
|
-
### `network_project`
|
216
|
-
|
217
|
-
GCE project which network belongs to; default is same as `project`
|
218
|
-
|
219
|
-
### `subnet`
|
220
|
-
|
221
|
-
GCE subnetwork that instance will be attached to. Only applies to custom networks.
|
222
|
-
|
223
|
-
### `subnet_project`
|
224
|
-
|
225
|
-
GCE project which subnet belongs to. Only applies when `subnet` is used; default is same as `project`
|
226
|
-
|
227
|
-
### `preemptible`
|
228
|
-
|
229
|
-
If set to `true`, GCE instance will be brought up as a [preemptible](https://cloud.google.com/compute/docs/instances/preemptible) virtual machine,
|
230
|
-
that runs at a much lower price than normal instances. However, Compute
|
231
|
-
Engine might terminate (preempt) these instances if it requires access
|
232
|
-
to those resources for other tasks; default: `false`
|
233
|
-
|
234
|
-
### `service_account_name`
|
235
|
-
|
236
|
-
The name of the service account to use when enabling account scopes. This
|
237
|
-
is usually an email-formatted service account name created via the "Permissions"
|
238
|
-
tab of the GCP console.
|
239
|
-
|
240
|
-
This is ignored unless you specify any `service_account_scopes`.
|
241
|
-
|
242
|
-
Default: "default"
|
243
|
-
|
244
|
-
### `service_account_scopes`
|
245
|
-
|
246
|
-
An array of scopes to add to the instance, used to grant additional permissions
|
247
|
-
within GCP.
|
248
|
-
|
249
|
-
The scopes can either be a full URL (i.e. `https://www.googleapis.com/auth/devstorage.read_write`),
|
250
|
-
the short-name (i.e. `devstorage.read_write`), or a gcloud alias (i.e. `storage-rw`).
|
251
|
-
|
252
|
-
See the output of `gcloud compute instances create --help` for a full list of scopes.
|
253
|
-
|
254
|
-
### `tags`
|
255
|
-
|
256
|
-
Array of tags to associate with instance; default: `[]`
|
257
|
-
|
258
|
-
### `use_private_ip`
|
259
|
-
|
260
|
-
Boolean indicating whether or not to connect to the instance using its
|
261
|
-
private IP address. If `true`, kitchen-google will also not provision
|
262
|
-
a public IP for this instance. Default: `false`
|
263
|
-
|
264
|
-
### `wait_time`
|
265
|
-
|
266
|
-
Amount of time, in seconds, to wait for any API interactions. Default: 600
|
267
|
-
|
268
|
-
### `refresh_rate`
|
269
|
-
|
270
|
-
Amount of time, in seconds, to refresh the status of an API interaction. Default: 2
|
271
|
-
|
272
|
-
### `metadata`
|
273
|
-
|
274
|
-
Allows custom instance metadata to be set.
|
275
|
-
The following metadata is set by default if no metadata configuration is provided:
|
276
|
-
Default:
|
277
|
-
|
278
|
-
|
279
|
-
"created-by" => "test-kitchen",
|
280
|
-
"test-kitchen-instance" => <instance.name>,
|
281
|
-
"test-kitchen-user" => <env_user>,
|
282
|
-
|
283
|
-
### Disk configuration
|
284
|
-
|
285
|
-
NOTE: In order to support multiple disks in this driver, the disk configuration has been reworked. However, old .kitchen-files will keep working and simply be adapted automatically.
|
286
|
-
|
287
|
-
```yaml
|
288
|
-
driver:
|
289
|
-
disks:
|
290
|
-
disk0:
|
291
|
-
autodelete_disk: false
|
292
|
-
disk1:
|
293
|
-
disk_size: 30
|
294
|
-
disk2:
|
295
|
-
disk_size: 50
|
296
|
-
```
|
297
|
-
|
298
|
-
In the above example the `disk0` would be automatically be used as the bootdisk (/dev/sda), `disk1` would be mounted as /dev/sdb and be 30 gigabytes in size. `disk2` would be mounted as /dev/sdc and 50 gigabytes in size. Any of these disks could be the bootdisk (see below), but since none is specified, disk0 is automatically elected. Note that if `disk1` would be set as bootdisk using `boot: true` it will be mounted as /dev/sda.
|
299
|
-
|
300
|
-
#### `boot`
|
301
|
-
|
302
|
-
Specifies wether or not a disk should be used as the boot disk for the instance. By default the first disk will be used as boot disk.
|
303
|
-
|
304
|
-
#### `autodelete_disk` - deprecated as standalone option
|
305
|
-
|
306
|
-
Boolean specifying whether or not to automatically delete boot disk
|
307
|
-
for test instance. Default: `true`
|
308
|
-
|
309
|
-
*This option is deprecated as a standlone configuration, but can be applied on a per disk level.*
|
310
|
-
|
311
|
-
NOTE: If you set this to false, once Test Kitchen destroys your instance,
|
312
|
-
the boot disk used will remain in your project. You will need to manually delete it to
|
313
|
-
avoid consuming unused resources by either using the `gcloud compute disks delete`
|
314
|
-
command in the GCP SDK or by using `knife google disk delete` from
|
315
|
-
[knife-google](https://github.com/chef/knife-google).
|
316
|
-
|
317
|
-
#### `disk_size` - deprecated as standalone option
|
318
|
-
|
319
|
-
Size, in gigabytes, of boot disk. Default: `10`.
|
320
|
-
|
321
|
-
*This option is deprecated as a standlone configuration, but can be applied on a per disk level.*
|
322
|
-
|
323
|
-
Some images, such as windows images, have a larger source image size
|
324
|
-
and require the disk_size to be the same size or larger than the source.
|
325
|
-
An error message will be displayed to you indicating this requirement
|
326
|
-
if necessary.
|
327
|
-
|
328
|
-
#### `disk_type` - deprecated as standalone option
|
329
|
-
|
330
|
-
Type of the disk. Default: `pd-standard`.
|
331
|
-
|
332
|
-
*This option is deprecated as a standlone configuration, but can be applied on a per disk level.*
|
333
|
-
|
334
|
-
Valid disk types:
|
335
|
-
|
336
|
-
- `pd-standard`: Attached magnetic hard drive
|
337
|
-
- `pd-ssd`: Attached SSD
|
338
|
-
- `local-ssd`: [Local scratch SSD](https://cloud.google.com/compute/docs/disks/#localssds). NOTE: You cannot specify their size. They always are 375 GB!
|
339
|
-
|
340
|
-
### Transport Settings
|
341
|
-
|
342
|
-
Beginning with Test Kitchen 1.4, settings related to the transport (i.e. how to connect
|
343
|
-
to the instance) have been moved to the `transport` section of the config, such as the
|
344
|
-
username, password, SSH key path, etc.
|
345
|
-
|
346
|
-
Therefore, you will need to update the transport section with the username configured
|
347
|
-
for the SSH Key you imported into your project metadata as described in the "SSH Keys"
|
348
|
-
section above. For example, if you are connecting as the "chefuser", your .kitchen.yml
|
349
|
-
might have a section like this:
|
350
|
-
|
351
|
-
```yaml
|
352
|
-
transport:
|
353
|
-
username: chefuser
|
354
|
-
```
|
355
|
-
|
356
|
-
Additionally, if you do not wish to use the standard default SSH key (`~/.ssh/id_rsa`),
|
357
|
-
you can set the `ssh_key` parameter in the `transport` section of your .kitchen.yml.
|
358
|
-
For example, if you want to use the SSH key auto-generated by the GCP SDK:
|
359
|
-
|
360
|
-
```yaml
|
361
|
-
transport:
|
362
|
-
ssh_key:
|
363
|
-
- ~/.ssh/google_compute_engine
|
364
|
-
```
|
365
|
-
|
366
|
-
## Example .kitchen.yml
|
367
|
-
|
368
|
-
```yaml
|
369
|
-
---
|
370
|
-
driver:
|
371
|
-
name: gce
|
372
|
-
project: mycompany-test
|
373
|
-
zone: us-east1-c
|
374
|
-
email: me@mycompany.com
|
375
|
-
tags:
|
376
|
-
- devteam
|
377
|
-
- test-kitchen
|
378
|
-
service_account_scopes:
|
379
|
-
- devstorage.read_write
|
380
|
-
- userinfo.email
|
381
|
-
|
382
|
-
provisioner:
|
383
|
-
name: chef_zero
|
384
|
-
|
385
|
-
transport:
|
386
|
-
username: chefuser
|
387
|
-
|
388
|
-
platforms:
|
389
|
-
- name: centos-7
|
390
|
-
driver:
|
391
|
-
image_project: centos-cloud
|
392
|
-
image_name: centos-7-v20170124
|
393
|
-
metadata:
|
394
|
-
application: centos
|
395
|
-
release: a
|
396
|
-
version: 7
|
397
|
-
- name: ubuntu-16.04
|
398
|
-
driver:
|
399
|
-
image_project: ubuntu-os-cloud
|
400
|
-
image_family: ubuntu-1604-lts
|
401
|
-
metadata:
|
402
|
-
application: ubuntu
|
403
|
-
release: a
|
404
|
-
version: 1604
|
405
|
-
- name: windows
|
406
|
-
driver:
|
407
|
-
image_project: windows-cloud
|
408
|
-
image_name: windows-server-2012-r2-dc-v20170117
|
409
|
-
disk_size: 50
|
410
|
-
metadata:
|
411
|
-
application: windows
|
412
|
-
release: a
|
413
|
-
version: cloud
|
414
|
-
|
415
|
-
suites:
|
416
|
-
- name: default
|
417
|
-
run_list:
|
418
|
-
- recipe[gcetest::default]
|
419
|
-
attributes:
|
420
|
-
```
|
421
|
-
|
422
|
-
## Development
|
423
|
-
|
424
|
-
Source is hosted on [GitHub](https://github.com/test-kitchen/kitchen-google).
|
425
|
-
|
426
|
-
* Pull requests are welcome, using topic branches if possible:
|
427
|
-
|
428
|
-
1. Fork the repo.
|
429
|
-
2. Create a feature branch, commit changes to it and push them.
|
430
|
-
3. Submit a pull request.
|
431
|
-
|
432
|
-
* Report issues or submit feature requests on [GitHub](https://github.com/test-kitchen/kitchen-google/issues)
|
433
|
-
|
434
|
-
## Author, Acknowledgements, Etc.
|
435
|
-
|
436
|
-
Created and maintained by [Andrew Leonard](http://andyleonard.com)
|
437
|
-
([andy@hurricane-ridge.com](mailto:andy@hurricane-ridge.com)).
|
438
|
-
|
439
|
-
The initial release drew heavily on the
|
440
|
-
[kitchen-ec2](https://github.com/opscode/kitchen-ec2/) gem for both
|
441
|
-
inspiration and implementation details. Any bugs, however, are solely
|
442
|
-
the author's own doing.
|
443
|
-
|
444
|
-
## License
|
445
|
-
|
446
|
-
Licensed under Apache 2.0.
|