kitchen-gce 0.0.1 → 0.0.4

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.
@@ -0,0 +1,15 @@
1
+ ### Bug fixes
2
+
3
+ * In GCE, instance names must be unique; derive by default from
4
+ `<suite>-<platform>` and a UUID.
5
+ * README formatting and clarity fixes.
6
+
7
+ ### Improvements
8
+
9
+ * Add concept of an "area" (us, europe, any) to automatically select
10
+ an availability zone from those that are up within the requested
11
+ area for each instance.
12
+
13
+ ## 0.0.1 / 2013-10-20
14
+
15
+ ### Initial release
data/Gemfile CHANGED
@@ -1 +1,4 @@
1
1
  source 'https://rubygems.org'
2
+
3
+ # Specify dependencies in gemspec:
4
+ gemspec
data/README.md CHANGED
@@ -18,12 +18,14 @@ which to run your test-kitchen instances, create one, noting the
18
18
  Console](https://code.google.com/apis/console/), create a "service
19
19
  account" for the project under the "API Access" tab. Save the key
20
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).
21
+ (e.g. 123456789012@developer.gserviceaccount.com - not the project
22
+ owner's email address).
23
23
 
24
24
  If you have not [set up SSH keys for your GCE
25
25
  environment](https://developers.google.com/compute/docs/instances#sshkeys),
26
- you must also do that prior to using kitchen-gce.
26
+ you must also do that prior to using kitchen-gce. Also, you will
27
+ likely want to add your GCE SSH keys to ssh-agent prior to converging
28
+ any instances.
27
29
 
28
30
  ## Installation
29
31
 
@@ -45,6 +47,16 @@ Then, execute `bundle install`.
45
47
 
46
48
  ## Configuration
47
49
 
50
+ ### area
51
+
52
+ Area in which to launch instances. For the purposes of this driver,
53
+ "area" is defined as the part prior to the first hyphen in an
54
+ availability zone's name; e.g. in "us-central1-b", the area is "us".
55
+ Specifying area but not "zone_name" allows kitchen-gce to avoid
56
+ launching instances into a zone that is down for maintenance. If
57
+ "any" is specified, kitchen-gce will select a zone from all areas.
58
+ Default: `us` (lowest cost area); valid values: `any`, `europe`, `us`
59
+
48
60
  ### google_client_email
49
61
 
50
62
  **Required** Email address associated with your GCE service account.
@@ -69,11 +81,13 @@ instances will be launched.
69
81
 
70
82
  GCE instance type (size) to launch; default: `n1-standard-1`
71
83
 
72
- ### name
84
+ ### inst_name
73
85
 
74
86
  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}`
87
+ instance identifier and must be unique. If none is specified, a unique
88
+ name will be auto-generated; note that auto-generated names must be
89
+ used if there is more than one test suite. Default:
90
+ `<suite>-<platform>-<UUID>`
77
91
 
78
92
  ### username
79
93
 
@@ -82,7 +96,8 @@ to the appropriate SSH keys. Default: `ENV['USER']`
82
96
 
83
97
  ### zone_name
84
98
 
85
- Location into which instances will be launched. Default: `us-central1-b`
99
+ Location into which instances will be launched. If not specified, a
100
+ zone is chosen from available zones within the "area" (see above).
86
101
 
87
102
  ## Example
88
103
 
@@ -93,6 +108,7 @@ like this:
93
108
  ---
94
109
  driver_plugin: gce
95
110
  driver_config:
111
+ area: any
96
112
  google_client_email: "123456789012@developer.gserviceaccount.com"
97
113
  google_key_location: "<%= ENV['HOME']%>/gce/1234567890abcdef1234567890abcdef12345678-privatekey.p12"
98
114
  google_project: "alpha-bravo-123"
@@ -126,11 +142,11 @@ Source is hosted on [GitHub](https://github.com/anl/kitchen-gce).
126
142
  Created and maintained by [Andrew Leonard](http://andyleonard.com)
127
143
  ([andy@hurricane-ridge.com](mailto:andy@hurricane-ridge.com)).
128
144
 
129
- The initial implementation drew heavily on the
145
+ The initial release drew heavily on the
130
146
  [kitchen-ec2](https://github.com/opscode/kitchen-ec2/) gem for both
131
147
  inspiration and implementation details. Any bugs, however, are solely
132
- the author's own fault.
148
+ the author's own doing.
133
149
 
134
150
  ## License
135
151
 
136
- Apache 2.0.
152
+ Licensed under Apache 2.0.
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'kitchen-gce'
3
- s.version = '0.0.1'
3
+ s.version = '0.0.4'
4
4
  s.date = '2013-10-20'
5
5
  s.summary = 'Kitchen::Driver::Gce'
6
6
  s.description = 'A Test-Kitchen driver for Google Compute Engine'
@@ -10,7 +10,11 @@ Gem::Specification.new do |s|
10
10
  s.homepage = 'https://github.com/anl/kitchen-gce'
11
11
  s.license = 'Apache 2.0'
12
12
 
13
- s.add_dependency 'test-kitchen', '~> 1.0.0.beta.3'
14
- s.add_dependency 'fog', '>= 1.11.0'
13
+ s.add_dependency 'test-kitchen'
14
+ s.add_dependency 'fog', '>= 1.19.0'
15
15
  s.add_dependency 'google-api-client'
16
+
17
+ s.add_development_dependency 'bundler'
18
+ s.add_development_dependency 'rspec'
19
+ s.add_development_dependency 'tailor'
16
20
  end
@@ -15,6 +15,7 @@
15
15
  # limitations under the License.
16
16
 
17
17
  require 'fog'
18
+ require 'securerandom'
18
19
 
19
20
  require 'kitchen'
20
21
 
@@ -22,10 +23,11 @@ module Kitchen
22
23
  module Driver
23
24
  class Gce < Kitchen::Driver::SSHBase
24
25
 
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'
26
+ default_config :area, 'us'
27
+ default_config :machine_type, 'n1-standard-1'
28
+ default_config :inst_name, nil
29
+ default_config :username, ENV['USER']
30
+ default_config :zone_name, nil
29
31
 
30
32
  required_config :google_client_email
31
33
  required_config :google_key_location
@@ -33,7 +35,10 @@ module Kitchen
33
35
  required_config :image_name
34
36
 
35
37
  def create(state)
36
- server= create_instance
38
+ return if state[:server_id]
39
+
40
+ config[:inst_name] ||= generate_name
41
+ server = create_instance
37
42
  state[:server_id] = server.identity
38
43
 
39
44
  info("GCE instance <#{state[:server_id]}> created.")
@@ -56,7 +61,7 @@ module Kitchen
56
61
  end
57
62
 
58
63
  private
59
-
64
+
60
65
  def connection
61
66
  Fog::Compute.new({
62
67
  :provider => 'google',
@@ -68,13 +73,46 @@ module Kitchen
68
73
 
69
74
  def create_instance
70
75
  connection.servers.create({
71
- :name => config[:name],
76
+ :name => config[:inst_name],
72
77
  :image_name => config[:image_name],
73
78
  :machine_type => config[:machine_type],
74
- :zone_name => config[:zone_name],
79
+ :zone_name => get_zone,
75
80
  })
76
81
  end
77
82
 
83
+ def get_zone
84
+ if config[:zone_name].nil?
85
+ zones = []
86
+ connection.zones.each do |z|
87
+ case config[:area]
88
+ when 'us'
89
+ if z.name.match(/^us/) and z.status == 'UP'
90
+ zones.push(z)
91
+ end
92
+ when 'europe'
93
+ if z.name.match(/^europe/) and z.status == 'UP'
94
+ zones.push(z)
95
+ end
96
+ when 'any'
97
+ if z.status == 'UP'
98
+ zones.push(z)
99
+ end
100
+ else
101
+ raise ArgumentError, 'Unknown area'
102
+ end
103
+ end
104
+ return zones.sample.name
105
+ else
106
+ return config[:zone_name]
107
+ end
108
+ end
109
+
110
+ def generate_name
111
+ # Inspired by generate_name from kitchen-rackspace
112
+ base_name = instance.name[0..26] # UUID is 36 chars, max name length 63
113
+ "#{base_name}-#{SecureRandom.uuid}"
114
+ end
115
+
78
116
  end
79
117
  end
80
118
  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.0.1
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -16,17 +16,17 @@ dependencies:
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ~>
19
+ - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: 1.0.0.beta.3
21
+ version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ~>
27
+ - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
- version: 1.0.0.beta.3
29
+ version: '0'
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: fog
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -34,7 +34,7 @@ dependencies:
34
34
  requirements:
35
35
  - - ! '>='
36
36
  - !ruby/object:Gem::Version
37
- version: 1.11.0
37
+ version: 1.19.0
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,7 +42,7 @@ dependencies:
42
42
  requirements:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
- version: 1.11.0
45
+ version: 1.19.0
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: google-api-client
48
48
  requirement: !ruby/object:Gem::Requirement
@@ -59,6 +59,54 @@ dependencies:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: bundler
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: tailor
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
62
110
  description: A Test-Kitchen driver for Google Compute Engine
63
111
  email: andy@hurricane-ridge.com
64
112
  executables: []
@@ -66,6 +114,7 @@ extensions: []
66
114
  extra_rdoc_files: []
67
115
  files:
68
116
  - .gitignore
117
+ - CHANGELOG.md
69
118
  - Gemfile
70
119
  - LICENSE
71
120
  - README.md
@@ -84,12 +133,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
84
133
  - - ! '>='
85
134
  - !ruby/object:Gem::Version
86
135
  version: '0'
136
+ segments:
137
+ - 0
138
+ hash: -3638187786435759861
87
139
  required_rubygems_version: !ruby/object:Gem::Requirement
88
140
  none: false
89
141
  requirements:
90
142
  - - ! '>='
91
143
  - !ruby/object:Gem::Version
92
144
  version: '0'
145
+ segments:
146
+ - 0
147
+ hash: -3638187786435759861
93
148
  requirements: []
94
149
  rubyforge_project:
95
150
  rubygems_version: 1.8.23