kitchen-gce 0.0.1
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/.gitignore +5 -0
- data/Gemfile +1 -0
- data/LICENSE +15 -0
- data/README.md +136 -0
- data/kitchen-gce.gemspec +16 -0
- data/lib/kitchen/driver/gce.rb +80 -0
- metadata +99 -0
data/Gemfile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
source 'https://rubygems.org'
|
data/LICENSE
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Author:: Andrew Leonard (<andy@hurricane-ridge.com>)
|
2
|
+
|
3
|
+
Copyright (C) 2013, Andrew Leonard
|
4
|
+
|
5
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
you may not use this file except in compliance with the License.
|
7
|
+
You may obtain a copy of the License at
|
8
|
+
|
9
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
|
11
|
+
Unless required by applicable law or agreed to in writing, software
|
12
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
See the License for the specific language governing permissions and
|
15
|
+
limitations under the License.
|
data/README.md
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
# Kitchen::Gce - A Test Kitchen Driver for Google Compute Engine
|
2
|
+
|
3
|
+
[](https://codeclimate.com/github/anl/kitchen-gce)
|
4
|
+
|
5
|
+
This is a [Test Kitchen](https://github.com/opscode/test-kitchen/)
|
6
|
+
driver for Google Compute Engine. While similar to EC2 and other IaaS
|
7
|
+
providers, GCE has a couple of advantages for Chef cookbook testing:
|
8
|
+
|
9
|
+
* (Subjectively) faster instance launch times; and
|
10
|
+
* Sub-hour billing.
|
11
|
+
|
12
|
+
## Requirements
|
13
|
+
|
14
|
+
A [Google Cloud Platform](https://cloud.google.com) account is
|
15
|
+
required. If you do not already have an appropriate "project" in
|
16
|
+
which to run your test-kitchen instances, create one, noting the
|
17
|
+
"project id". Then, within the [Google API
|
18
|
+
Console](https://code.google.com/apis/console/), create a "service
|
19
|
+
account" for the project under the "API Access" tab. Save the key
|
20
|
+
file, and note the email address associated with the service account
|
21
|
+
(e.g. <number>@developer.gserviceaccount.com - not the project owner's
|
22
|
+
email address).
|
23
|
+
|
24
|
+
If you have not [set up SSH keys for your GCE
|
25
|
+
environment](https://developers.google.com/compute/docs/instances#sshkeys),
|
26
|
+
you must also do that prior to using kitchen-gce.
|
27
|
+
|
28
|
+
## Installation
|
29
|
+
|
30
|
+
Assuming you are using Bundler, ensure the Gemfile within your Chef
|
31
|
+
cookbook contains at least the following:
|
32
|
+
|
33
|
+
```ruby
|
34
|
+
source 'https://rubygems.org'
|
35
|
+
|
36
|
+
gem 'berkshelf'
|
37
|
+
|
38
|
+
group :integration do
|
39
|
+
gem 'test-kitchen', '~> 1.0.0.beta'
|
40
|
+
gem 'kitchen-gce'
|
41
|
+
end
|
42
|
+
```
|
43
|
+
|
44
|
+
Then, execute `bundle install`.
|
45
|
+
|
46
|
+
## Configuration
|
47
|
+
|
48
|
+
### google_client_email
|
49
|
+
|
50
|
+
**Required** Email address associated with your GCE service account.
|
51
|
+
(N.B. - this is not the same as the Google Cloud Platform user's email
|
52
|
+
account; should be in the form
|
53
|
+
"123456789012@developer.gserviceaccount.com".)
|
54
|
+
|
55
|
+
### google_key_location
|
56
|
+
|
57
|
+
**Required** Path to GCE service account key file.
|
58
|
+
|
59
|
+
### google_project
|
60
|
+
|
61
|
+
**Required** Project ID of the GCE project into which test-kitchen
|
62
|
+
instances will be launched.
|
63
|
+
|
64
|
+
### image_name
|
65
|
+
|
66
|
+
**Required** Operating system image to deploy.
|
67
|
+
|
68
|
+
### machine_type
|
69
|
+
|
70
|
+
GCE instance type (size) to launch; default: `n1-standard-1`
|
71
|
+
|
72
|
+
### name
|
73
|
+
|
74
|
+
Name to give to instance; unlike EC2's "Name" tag, this is used as an
|
75
|
+
instance identifier and must be unique. Default:
|
76
|
+
`test-kitchen-#{Time.now.to_i}`
|
77
|
+
|
78
|
+
### username
|
79
|
+
|
80
|
+
Username to log into instance as; this user is assumed to have access
|
81
|
+
to the appropriate SSH keys. Default: `ENV['USER']`
|
82
|
+
|
83
|
+
### zone_name
|
84
|
+
|
85
|
+
Location into which instances will be launched. Default: `us-central1-b`
|
86
|
+
|
87
|
+
## Example
|
88
|
+
|
89
|
+
An example `.kitchen.yml` file using kitchen-gce might look something
|
90
|
+
like this:
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
---
|
94
|
+
driver_plugin: gce
|
95
|
+
driver_config:
|
96
|
+
google_client_email: "123456789012@developer.gserviceaccount.com"
|
97
|
+
google_key_location: "<%= ENV['HOME']%>/gce/1234567890abcdef1234567890abcdef12345678-privatekey.p12"
|
98
|
+
google_project: "alpha-bravo-123"
|
99
|
+
|
100
|
+
platforms:
|
101
|
+
- name: debian-7
|
102
|
+
driver_config:
|
103
|
+
image_name: debian-7-wheezy-v20130926
|
104
|
+
require_chef_omnibus: true
|
105
|
+
|
106
|
+
suites:
|
107
|
+
- name: default
|
108
|
+
run_list: ["recipe[somecookbook]"]
|
109
|
+
attributes: {}
|
110
|
+
```
|
111
|
+
|
112
|
+
## Development
|
113
|
+
|
114
|
+
Source is hosted on [GitHub](https://github.com/anl/kitchen-gce).
|
115
|
+
|
116
|
+
* Pull requests are welcome, using topic branches if possible:
|
117
|
+
|
118
|
+
1. Fork the repo.
|
119
|
+
2. Create a feature branch, commit changes to it and push them.
|
120
|
+
3. Submit a pull request.
|
121
|
+
|
122
|
+
* Report issues or submit feature requests on [GitHub](https://github.com/anl/kitchen-gce/issues)
|
123
|
+
|
124
|
+
## Author, Acknowledgements, Etc.
|
125
|
+
|
126
|
+
Created and maintained by [Andrew Leonard](http://andyleonard.com)
|
127
|
+
([andy@hurricane-ridge.com](mailto:andy@hurricane-ridge.com)).
|
128
|
+
|
129
|
+
The initial implementation drew heavily on the
|
130
|
+
[kitchen-ec2](https://github.com/opscode/kitchen-ec2/) gem for both
|
131
|
+
inspiration and implementation details. Any bugs, however, are solely
|
132
|
+
the author's own fault.
|
133
|
+
|
134
|
+
## License
|
135
|
+
|
136
|
+
Apache 2.0.
|
data/kitchen-gce.gemspec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'kitchen-gce'
|
3
|
+
s.version = '0.0.1'
|
4
|
+
s.date = '2013-10-20'
|
5
|
+
s.summary = 'Kitchen::Driver::Gce'
|
6
|
+
s.description = 'A Test-Kitchen driver for Google Compute Engine'
|
7
|
+
s.authors = ['Andrew Leonard']
|
8
|
+
s.email = 'andy@hurricane-ridge.com'
|
9
|
+
s.files = `git ls-files`.split($/)
|
10
|
+
s.homepage = 'https://github.com/anl/kitchen-gce'
|
11
|
+
s.license = 'Apache 2.0'
|
12
|
+
|
13
|
+
s.add_dependency 'test-kitchen', '~> 1.0.0.beta.3'
|
14
|
+
s.add_dependency 'fog', '>= 1.11.0'
|
15
|
+
s.add_dependency 'google-api-client'
|
16
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# Author:: Andrew Leonard (<andy@hurricane-ridge.com>)
|
2
|
+
#
|
3
|
+
# Copyright (C) 2013, Andrew Leonard
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
require 'fog'
|
18
|
+
|
19
|
+
require 'kitchen'
|
20
|
+
|
21
|
+
module Kitchen
|
22
|
+
module Driver
|
23
|
+
class Gce < Kitchen::Driver::SSHBase
|
24
|
+
|
25
|
+
default_config :machine_type, 'n1-standard-1'
|
26
|
+
default_config :name, "test-kitchen-#{Time.now.to_i}"
|
27
|
+
default_config :username, ENV['USER']
|
28
|
+
default_config :zone_name, 'us-central1-b'
|
29
|
+
|
30
|
+
required_config :google_client_email
|
31
|
+
required_config :google_key_location
|
32
|
+
required_config :google_project
|
33
|
+
required_config :image_name
|
34
|
+
|
35
|
+
def create(state)
|
36
|
+
server= create_instance
|
37
|
+
state[:server_id] = server.identity
|
38
|
+
|
39
|
+
info("GCE instance <#{state[:server_id]}> created.")
|
40
|
+
server.wait_for { print '.'; ready? } ; print '(server ready)'
|
41
|
+
state[:hostname] = server.public_ip_address || server.private_ip_address
|
42
|
+
wait_for_sshd(state[:hostname], config[:username])
|
43
|
+
puts '(ssh ready)'
|
44
|
+
rescue Fog::Errors::Error, Excon::Errors::Error => ex
|
45
|
+
raise ActionFailed, ex.message
|
46
|
+
end
|
47
|
+
|
48
|
+
def destroy(state)
|
49
|
+
return if state[:server_id].nil?
|
50
|
+
|
51
|
+
server = connection.servers.get(state[:server_id])
|
52
|
+
server.destroy unless server.nil?
|
53
|
+
info("GCE instance <#{state[:server_id]}> destroyed.")
|
54
|
+
state.delete(:server_id)
|
55
|
+
state.delete(:hostname)
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def connection
|
61
|
+
Fog::Compute.new({
|
62
|
+
:provider => 'google',
|
63
|
+
:google_client_email => config[:google_client_email],
|
64
|
+
:google_key_location => config[:google_key_location],
|
65
|
+
:google_project => config[:google_project],
|
66
|
+
})
|
67
|
+
end
|
68
|
+
|
69
|
+
def create_instance
|
70
|
+
connection.servers.create({
|
71
|
+
:name => config[:name],
|
72
|
+
:image_name => config[:image_name],
|
73
|
+
:machine_type => config[:machine_type],
|
74
|
+
:zone_name => config[:zone_name],
|
75
|
+
})
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
metadata
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kitchen-gce
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Andrew Leonard
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-10-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: test-kitchen
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.0.0.beta.3
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.0.0.beta.3
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: fog
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 1.11.0
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.11.0
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: google-api-client
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
description: A Test-Kitchen driver for Google Compute Engine
|
63
|
+
email: andy@hurricane-ridge.com
|
64
|
+
executables: []
|
65
|
+
extensions: []
|
66
|
+
extra_rdoc_files: []
|
67
|
+
files:
|
68
|
+
- .gitignore
|
69
|
+
- Gemfile
|
70
|
+
- LICENSE
|
71
|
+
- README.md
|
72
|
+
- kitchen-gce.gemspec
|
73
|
+
- lib/kitchen/driver/gce.rb
|
74
|
+
homepage: https://github.com/anl/kitchen-gce
|
75
|
+
licenses:
|
76
|
+
- Apache 2.0
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
89
|
+
requirements:
|
90
|
+
- - ! '>='
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
requirements: []
|
94
|
+
rubyforge_project:
|
95
|
+
rubygems_version: 1.8.23
|
96
|
+
signing_key:
|
97
|
+
specification_version: 3
|
98
|
+
summary: Kitchen::Driver::Gce
|
99
|
+
test_files: []
|