kitchen-ec2 2.1.0 → 2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 959a1ab9d5bc68f378d275e54b2582173dd1b639
4
- data.tar.gz: e1860a9b7dd6edc37eb04af7ef451d0b0e05575b
3
+ metadata.gz: 28db84523fe129c18d97d7d4ce035e53018dae22
4
+ data.tar.gz: e9614c002ae5569a2142b0778bc55672820ae2c8
5
5
  SHA512:
6
- metadata.gz: 3d8825aab45d7c154f9e4f718fad006ff0e3b469f51da94ba531a7de42e99c05595d41f0195ac4ac05998d6e2e26f30f89f52da93401e40b689b2b21c8d525ed
7
- data.tar.gz: fb078de3ae30c8eac13bf7b24b7db968c5083f281aeae3f425230d941aace2f2405e6a7eedfb3c3fed34a7d8cdce43a078ff360df0c2e921fccbe07e72415cce
6
+ metadata.gz: 4d6bb1cebdbf37961f07aab3e0b53f6397cf79f3f601889ddc8f82f478730e00099430258ff059c2ce34e9247f1a57da046b316672e987fa99c757e1da9310f8
7
+ data.tar.gz: 42722c4235563507a4b30e2b4f28edb6b8fbe08c46e6a3203b90b576674e9c4b0ba7d678d7daa5ece7c5d58a13ac437f02916a3f277cd871e1246e97e4c24af9
@@ -1,6 +1,23 @@
1
1
  # Change Log
2
2
 
3
+ ## [v2.2.0](https://github.com/test-kitchen/kitchen-ec2/tree/v2.2.0) (2018-01-27)
4
+
5
+ [Full Changelog](https://github.com/test-kitchen/kitchen-ec2/compare/v2.1.0...v2.2.0)
6
+
7
+ - When config validation fails we now show you just the error message instead of the full stack trace with a buried error message
8
+ - Removed the username logic for FreeBSD < 9.1 as those releases are EOL
9
+ - Add support for Debian 10/11 so we'll support them as soon as they're released
10
+ - Added support for the 'host' tenancy value
11
+ - Added proper config validation for tenancy instead of silently skipping bad data
12
+ - Properly handle Integers in tags instead of failing the run
13
+ - Properly handle nil values in tags instead of failing the run
14
+ - Add validation to make sure the tags are passed as a single hash instead of an array of each tag
15
+ - Update our Yard dev dependency to make sure we have 0.9.11+ to avoid a CVE in earlier releases
16
+ - Update links in docs and distros in the examples
17
+ - Removed Rubocop comments that weren't necessary from the code
18
+
3
19
  ## [v2.1.0](https://github.com/test-kitchen/kitchen-ec2/tree/v2.1.0) (2018-01-27)
20
+
4
21
  [Full Changelog](https://github.com/test-kitchen/kitchen-ec2/compare/v2.0.0...v2.1.0)
5
22
 
6
23
  **Merged pull requests:**
data/README.md CHANGED
@@ -14,7 +14,7 @@ instances. Use Amazon's cloud for your infrastructure testing!
14
14
  1. Install [ChefDK](https://downloads.chef.io/chefdk). If testing things other
15
15
  than Chef cookbooks, please consult your driver's documentation for information
16
16
  on what to install.
17
- 2. Install the [AWS command line tools](http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html).
17
+ 2. Install the [AWS command line tools](https://docs.aws.amazon.com/cli/latest/userguide/installing.html).
18
18
  3. Run `aws configure`. This will set up your AWS credentials for both the AWS
19
19
  CLI tools and kitchen-ec2.
20
20
  4. Add or exit the `driver` section of your `.kitchen.yml`:
@@ -152,7 +152,7 @@ specify.
152
152
 
153
153
  #### SSH
154
154
 
155
- The `aws_ssh_key_id` value is the name of the AWS key pair you want to use. The default will be read from the `AWS_SSH_KEY_ID` environment variable if set. If a key ID is not specified, a temporary key will be created for you.
155
+ The `aws_ssh_key_id` value is the name of the AWS key pair you want to use. The default will be read from the `AWS_SSH_KEY_ID` environment variable if set. If a key ID is not specified, a temporary key will be created for you (**>= 2.1.0**).
156
156
 
157
157
  To see a list of existing key pair IDs in a region, run `aws ec2 describe-key-pairs --region us-east-1`.
158
158
 
@@ -194,7 +194,7 @@ or `paravirtual`. (`paravirtual` images are incompatible with `t2.micro`.)
194
194
 
195
195
  An Array of EC2 [security groups][group_docs] which will be applied to the
196
196
  instance. If no security group is specified, a temporary group will be created
197
- automatically which allows SSH and WinRM.
197
+ automatically which allows SSH and WinRM (**>= 2.1.0**).
198
198
 
199
199
  #### `security_group_filter`
200
200
 
@@ -425,18 +425,8 @@ transport:
425
425
  username: ubuntu
426
426
 
427
427
  platforms:
428
- - name: ubuntu-12.04
429
- - name: centos-6.4
430
- - name: ubuntu-15.04
431
- driver:
432
- image_id: ami-83211eb3
433
- block_device_mappings:
434
- - device_name: /dev/sda1
435
- ebs:
436
- volume_type: standard
437
- virtual_name: test
438
- volume_size: 15
439
- delete_on_termination: true
428
+ - name: ubuntu-16.04
429
+ - name: centos-6.9
440
430
  - name: centos-7
441
431
  driver:
442
432
  image_id: ami-c7d092f7
@@ -450,7 +440,7 @@ platforms:
450
440
  transport:
451
441
  username: centos
452
442
  - name: windows-2012r2
453
- - name: windows-2008r2
443
+ - name: windows-2016
454
444
 
455
445
  suites:
456
446
  # ...
@@ -481,17 +471,17 @@ Apache 2.0 (see [LICENSE][license])
481
471
  [license]: https://github.com/test-kitchen/kitchen-ec2/blob/master/LICENSE
482
472
  [repo]: https://github.com/test-kitchen/kitchen-ec2
483
473
  [driver_usage]: https://github.com/test-kitchen/kitchen-ec2
484
- [chef_omnibus_dl]: https://downloads.chef.io/chef-client/
474
+ [chef_omnibus_dl]: https://downloads.chef.io/chef
485
475
  [amis_json]: https://github.com/test-kitchen/kitchen-ec2/blob/master/data/amis.json
486
476
  [ami_docs]: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ComponentsAMIs.html
487
477
  [aws_site]: http://aws.amazon.com/
488
478
  [iam_site]: http://aws.amazon.com/iam
489
- [credentials_docs]: http://blogs.aws.amazon.com/security/post/Tx3D6U6WSFGOK2H/A-New-and-Standardized-Way-to-Manage-Credentials-in-the-AWS-SDKs
490
- [aws_sdk_gem]: http://docs.aws.amazon.com/sdkforruby/api/index.html
491
- [group_docs]: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html
492
- [instance_docs]: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html
493
- [key_id_docs]: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/verifying-your-key-pair.html
494
- [kitchenci]: http://kitchen.ci/
495
- [region_docs]: http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html
496
- [subnet_docs]: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html
497
- [vpc_docs]: http://docs.aws.amazon.com/AmazonVPC/latest/GettingStartedGuide/ExerciseOverview.html
479
+ [credentials_docs]: https://aws.amazon.com/blogs/security/a-new-and-standardized-way-to-manage-credentials-in-the-aws-sdks/
480
+ [aws_sdk_gem]: https://docs.aws.amazon.com/sdkforruby/api/index.html
481
+ [group_docs]: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html
482
+ [instance_docs]: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html
483
+ [key_id_docs]: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html
484
+ [kitchenci]: https://kitchen.ci/
485
+ [region_docs]: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html
486
+ [subnet_docs]: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ec2-subnet.html
487
+ [vpc_docs]: https://docs.aws.amazon.com/AmazonVPC/latest/GettingStartedGuide/ExerciseOverview.html
@@ -11,7 +11,7 @@ Gem::Specification.new do |gem|
11
11
  gem.email = ["fnichol@nichol.ca"]
12
12
  gem.description = "A Test Kitchen Driver for Amazon EC2"
13
13
  gem.summary = gem.description
14
- gem.homepage = "http://kitchen.ci/"
14
+ gem.homepage = "https://kitchen.ci/"
15
15
 
16
16
  gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
17
17
  gem.executables = []
@@ -30,7 +30,7 @@ Gem::Specification.new do |gem|
30
30
  gem.add_development_dependency "countloc", "~> 0.4"
31
31
  gem.add_development_dependency "maruku", "~> 0.6"
32
32
  gem.add_development_dependency "simplecov", "~> 0.7"
33
- gem.add_development_dependency "yard", "~> 0.8"
33
+ gem.add_development_dependency "yard", "~> 0.9", ">= 0.9.11"
34
34
 
35
35
  # style and complexity libraries are tightly version pinned as newer releases
36
36
  # may introduce new and undesireable style choices which would be immediately
@@ -2,7 +2,8 @@
2
2
  #
3
3
  # Author:: Tyler Ball (<tball@chef.io>)
4
4
  #
5
- # Copyright (C) 2015, Fletcher Nichol
5
+ # Copyright:: 2016-2018, Chef Software, Inc.
6
+ # Copyright:: 2015-2018, Fletcher Nichol
6
7
  #
7
8
  # Licensed under the Apache License, Version 2.0 (the "License");
8
9
  # you may not use this file except in compliance with the License.
@@ -32,7 +33,7 @@ module Kitchen
32
33
  # @author Tyler Ball <tball@chef.io>
33
34
  class Client
34
35
 
35
- def initialize( # rubocop:disable Metrics/ParameterLists
36
+ def initialize(
36
37
  region,
37
38
  profile_name = "default",
38
39
  http_proxy = nil,
@@ -48,8 +49,6 @@ module Kitchen
48
49
  ::Aws.config.update(:retry_limit => retry_limit) unless retry_limit.nil?
49
50
  end
50
51
 
51
- # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
52
-
53
52
  def create_instance(options)
54
53
  resource.create_instances(options)[0]
55
54
  end
@@ -2,7 +2,8 @@
2
2
  #
3
3
  # Author:: Tyler Ball (<tball@chef.io>)
4
4
  #
5
- # Copyright (C) 2015, Fletcher Nichol
5
+ # Copyright:: 2016-2018, Chef Software, Inc.
6
+ # Copyright:: 2015-2018, Fletcher Nichol
6
7
  #
7
8
  # Licensed under the Apache License, Version 2.0 (the "License");
8
9
  # you may not use this file except in compliance with the License.
@@ -94,7 +95,7 @@ module Kitchen
94
95
  i[:placement] = { :availability_zone => availability_zone.downcase }
95
96
  end
96
97
  tenancy = config[:tenancy]
97
- if tenancy && %w{default dedicated}.include?(tenancy)
98
+ if tenancy
98
99
  if i.key?(:placement)
99
100
  i[:placement][:tenancy] = tenancy
100
101
  else
@@ -137,7 +138,7 @@ module Kitchen
137
138
  i[:placement] = { :availability_zone => availability_zone.downcase }
138
139
  end
139
140
  tenancy = config[:tenancy]
140
- if tenancy && %w{default dedicated}.include?(tenancy)
141
+ if tenancy
141
142
  if i.key?(:placement)
142
143
  i[:placement][:tenancy] = tenancy
143
144
  else
@@ -1,3 +1,19 @@
1
+ #
2
+ # Copyright:: 2016-2018, Chef Software, Inc.
3
+ # Copyright:: 2015-2018, Fletcher Nichol
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
+
1
17
  module Kitchen
2
18
  module Driver
3
19
  class Aws
@@ -1,3 +1,18 @@
1
+ #
2
+ # Copyright:: 2016-2018, Chef Software, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
1
16
  require "kitchen/driver/aws/standard_platform"
2
17
 
3
18
  module Kitchen
@@ -1,3 +1,18 @@
1
+ #
2
+ # Copyright:: 2016-2018, Chef Software, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
1
16
  require "kitchen/driver/aws/standard_platform"
2
17
 
3
18
  module Kitchen
@@ -1,3 +1,18 @@
1
+ #
2
+ # Copyright:: 2016-2018, Chef Software, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
1
16
  require "kitchen/driver/aws/standard_platform"
2
17
 
3
18
  module Kitchen
@@ -8,11 +23,15 @@ module Kitchen
8
23
  class Debian < StandardPlatform
9
24
  StandardPlatform.platforms["debian"] = self
10
25
 
26
+ # 10/11 are listed last since we default to the first item in the hash
27
+ # and 10/11 are not released yet. When they're released move them up
11
28
  DEBIAN_CODENAMES = {
12
29
  "9" => "stretch",
13
30
  "8" => "jessie",
14
31
  "7" => "wheezy",
15
32
  "6" => "squeeze",
33
+ "11" => "bullseye",
34
+ "10" => "buster",
16
35
  }
17
36
 
18
37
  def username
@@ -1,3 +1,18 @@
1
+ #
2
+ # Copyright:: 2016-2018, Chef Software, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
1
16
  require "kitchen/driver/aws/standard_platform"
2
17
 
3
18
  module Kitchen
@@ -1,3 +1,18 @@
1
+ #
2
+ # Copyright:: 2016-2018, Chef Software, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
1
16
  require "kitchen/driver/aws/standard_platform"
2
17
 
3
18
  module Kitchen
@@ -9,7 +24,7 @@ module Kitchen
9
24
  StandardPlatform.platforms["freebsd"] = self
10
25
 
11
26
  def username
12
- (version && version.to_f < 9.1) ? "root" : "ec2-user"
27
+ "ec2-user"
13
28
  end
14
29
 
15
30
  def sudo_command
@@ -1,3 +1,18 @@
1
+ #
2
+ # Copyright:: 2016-2018, Chef Software, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
1
16
  require "kitchen/driver/aws/standard_platform"
2
17
 
3
18
  module Kitchen
@@ -1,3 +1,18 @@
1
+ #
2
+ # Copyright:: 2016-2018, Chef Software, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
1
16
  require "kitchen/driver/aws/standard_platform"
2
17
 
3
18
  module Kitchen
@@ -1,3 +1,18 @@
1
+ #
2
+ # Copyright:: 2016-2018, Chef Software, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
1
16
  require "kitchen/driver/aws/standard_platform"
2
17
 
3
18
  module Kitchen
@@ -2,7 +2,8 @@
2
2
  #
3
3
  # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
4
  #
5
- # Copyright (C) 2015, Fletcher Nichol
5
+ # Copyright:: 2016-2018, Chef Software, Inc.
6
+ # Copyright:: 2015-2018, Fletcher Nichol
6
7
  #
7
8
  # Licensed under the Apache License, Version 2.0 (the "License");
8
9
  # you may not use this file except in compliance with the License.
@@ -46,7 +47,7 @@ module Kitchen
46
47
  # Amazon EC2 driver for Test Kitchen.
47
48
  #
48
49
  # @author Fletcher Nichol <fnichol@nichol.ca>
49
- class Ec2 < Kitchen::Driver::Base # rubocop:disable Metrics/ClassLength
50
+ class Ec2 < Kitchen::Driver::Base
50
51
 
51
52
  kitchen_driver_api_version 2
52
53
 
@@ -103,8 +104,9 @@ module Kitchen
103
104
  end
104
105
 
105
106
  def self.validation_error(driver, old_key, new_key)
106
- raise "ERROR: The driver[#{driver.class.name}] config key `#{old_key}` " \
107
+ warn "ERROR: The driver[#{driver.class.name}] config key `#{old_key}` " \
107
108
  "has been removed, please use `#{new_key}`"
109
+ exit!
108
110
  end
109
111
 
110
112
  # TODO: remove these in 1.1
@@ -142,37 +144,61 @@ module Kitchen
142
144
  end
143
145
  end
144
146
 
147
+ # https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-instance.html
148
+ validations[:tenancy] = lambda do |attr, val, _driver|
149
+ unless %w{default host dedicated}.include?(val)
150
+ warn "'#{val}' is an invalid value for option '#{attr}'. " \
151
+ "Valid values are 'default', 'host', or 'dedicated'."
152
+ exit!
153
+ end
154
+ end
155
+
145
156
  # The access key/secret are now using the priority list AWS uses
146
157
  # Providing these inside the .kitchen.yml is no longer recommended
147
158
  validations[:aws_access_key_id] = lambda do |attr, val, _driver|
148
159
  unless val.nil?
149
- raise "#{attr} is no longer valid, please use " \
150
- "ENV['AWS_ACCESS_KEY_ID'] or ~/.aws/credentials. See " \
160
+ warn "#{attr} is no longer a valid config option, please use " \
161
+ "ENV['AWS_ACCESS_KEY_ID'] or ~/.aws/credentials. See " \
151
162
  "the README for more details"
163
+ exit!
152
164
  end
153
165
  end
154
166
  validations[:aws_secret_access_key] = lambda do |attr, val, _driver|
155
167
  unless val.nil?
156
- raise "#{attr} is no longer valid, please use " \
157
- "ENV['AWS_SECRET_ACCESS_KEY'] or ~/.aws/credentials. See " \
168
+ warn "#{attr} is no longer a valid config option, please use " \
169
+ "ENV['AWS_SECRET_ACCESS_KEY'] or ~/.aws/credentials. See " \
158
170
  "the README for more details"
171
+ exit!
159
172
  end
160
173
  end
161
174
  validations[:aws_session_token] = lambda do |attr, val, _driver|
162
175
  unless val.nil?
163
- raise "#{attr} is no longer valid, please use " \
164
- "ENV['AWS_SESSION_TOKEN'] or ~/.aws/credentials. See " \
176
+ warn "#{attr} is no longer a valid config option, please use " \
177
+ "ENV['AWS_SESSION_TOKEN'] or ~/.aws/credentials. See " \
165
178
  "the README for more details"
179
+ exit!
166
180
  end
167
181
  end
168
182
  validations[:instance_initiated_shutdown_behavior] = lambda do |attr, val, _driver|
169
183
  unless [nil, "stop", "terminate"].include?(val)
170
- raise "'#{val}' is an invalid value for option '#{attr}'. " \
184
+ warn "'#{val}' is an invalid value for option '#{attr}'. " \
171
185
  "Valid values are 'stop' or 'terminate'"
186
+ exit!
187
+ end
188
+ end
189
+
190
+ # empty keys cause failures when tagging and they make no sense
191
+ validations[:tags] = lambda do |attr, val, _driver|
192
+ # if someone puts the tags each on their own line it's an array not a hash
193
+ # @todo we should probably just do the right thing and support this format
194
+ if val.class == Array
195
+ warn "AWS instance tags must be specified as a single hash, not a tag " \
196
+ "on each line. Example: {:foo => 'bar', :bar => 'foo'}"
197
+ exit!
172
198
  end
173
199
  end
174
200
 
175
- def create(state) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
201
+ def create(state)
176
202
  return if state[:server_id]
177
203
  update_username(state)
178
204
 
@@ -211,7 +237,7 @@ module Kitchen
211
237
 
212
238
  # See https://github.com/aws/aws-sdk-ruby/issues/859
213
239
  # Tagging can fail with a NotFound error even though we waited until the server exists
214
- # Waiting can also fail, so we have to also retry on that. If it means we re-tag the
240
+ # Waiting can also fail, so we have to also retry on that. If it means we re-tag the
215
241
  # instance, so be it.
216
242
  # Tagging an instance is possible before volumes are attached. Tagging the volumes after
217
243
  # instance creation is consistent.
@@ -350,7 +376,7 @@ module Kitchen
350
376
  def update_username(state)
351
377
  # BUG: With the following equality condition on username, if the user specifies 'root'
352
378
  # as the transport's username then we will overwrite that value with one from the standard
353
- # platform definitions. This seems difficult to handle here as the default username is
379
+ # platform definitions. This seems difficult to handle here as the default username is
354
380
  # provided by the underlying transport classes, and is often non-nil (eg; 'root'), leaving
355
381
  # us no way to distinguish a user-set value from the transport's default.
356
382
  # See https://github.com/test-kitchen/kitchen-ec2/pull/273
@@ -388,7 +414,7 @@ module Kitchen
388
414
  ec2.create_instance(instance_data)
389
415
  end
390
416
 
391
- def submit_spot(state) # rubocop:disable Metrics/AbcSize
417
+ def submit_spot(state)
392
418
  debug("Creating EC2 Spot Instance..")
393
419
 
394
420
  spot_request_id = create_spot_request
@@ -428,7 +454,10 @@ module Kitchen
428
454
  def tag_server(server)
429
455
  if config[:tags] && !config[:tags].empty?
430
456
  tags = config[:tags].map do |k, v|
431
- { :key => k, :value => v }
457
+ # we convert the value to a string because
458
+ # nils should be passed as an empty String
459
+ # and Integers need to be represented as Strings
460
+ { :key => k, :value => v.to_s }
432
461
  end
433
462
  server.create_tags(:tags => tags)
434
463
  end
@@ -437,7 +466,7 @@ module Kitchen
437
466
  def tag_volumes(server)
438
467
  if config[:tags] && !config[:tags].empty?
439
468
  tags = config[:tags].map do |k, v|
440
- { :key => k, :value => v }
469
+ { :key => k, :value => v.to_s }
441
470
  end
442
471
  server.volumes.each do |volume|
443
472
  volume.create_tags(:tags => tags)
@@ -487,7 +516,7 @@ module Kitchen
487
516
  end
488
517
  end
489
518
 
490
- # Poll a block, waiting for it to return true. If it does not succeed
519
+ # Poll a block, waiting for it to return true. If it does not succeed
491
520
  # within the configured time we destroy the instance to save people money
492
521
  def wait_with_destroy(server, state, status_msg, &block)
493
522
  wait_log = proc do |attempts|
@@ -512,7 +541,6 @@ module Kitchen
512
541
  end
513
542
  end
514
543
 
515
- # rubocop:disable Lint/UnusedBlockArgument
516
544
  def fetch_windows_admin_password(server, state)
517
545
  wait_with_destroy(server, state, "to fetch windows admin password") do |aws_instance|
518
546
  enc = server.client.get_password_data(
@@ -527,7 +555,6 @@ module Kitchen
527
555
  state[:password] = pass
528
556
  info("Retrieved Windows password for instance <#{state[:server_id]}>.")
529
557
  end
530
- # rubocop:enable Lint/UnusedBlockArgument
531
558
 
532
559
  def with_request_limit_backoff(state)
533
560
  retries = 0
@@ -544,7 +571,7 @@ module Kitchen
544
571
  end
545
572
 
546
573
  #
547
- # Ordered mapping from config name to Fog name. Ordered by preference
574
+ # Ordered mapping from config name to Fog name. Ordered by preference
548
575
  # when looking up hostname.
549
576
  #
550
577
  INTERFACE_TYPES =
@@ -556,8 +583,8 @@ module Kitchen
556
583
  }
557
584
 
558
585
  #
559
- # Lookup hostname of provided server. If interface_type is provided use
560
- # that interface to lookup hostname. Otherwise, try ordered list of
586
+ # Lookup hostname of provided server. If interface_type is provided use
587
+ # that interface to lookup hostname. Otherwise, try ordered list of
561
588
  # options.
562
589
  #
563
590
  def hostname(server, interface_type = nil)
@@ -584,7 +611,6 @@ module Kitchen
584
611
  instance.provisioner[:sudo] ? instance.provisioner[:sudo_command].to_s : ""
585
612
  end
586
613
 
587
- # rubocop:disable Metrics/MethodLength, Metrics/LineLength
588
614
  def create_ec2_json(state)
589
615
  if windows_os?
590
616
  cmd = "New-Item -Force C:\\chef\\ohai\\hints\\ec2.json -ItemType File"
@@ -649,7 +675,6 @@ module Kitchen
649
675
  </powershell>
650
676
  EOH
651
677
  end
652
- # rubocop:enable Metrics/MethodLength, Metrics/LineLength
653
678
 
654
679
  def show_chosen_image
655
680
  # Print some debug stuff
@@ -2,7 +2,8 @@
2
2
  #
3
3
  # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
4
  #
5
- # Copyright (C) 2012, Fletcher Nichol
5
+ # Copyright:: 2016-2018, Chef Software, Inc.
6
+ # Copyright:: 2012-2018, Fletcher Nichol
6
7
  #
7
8
  # Licensed under the Apache License, Version 2.0 (the "License");
8
9
  # you may not use this file except in compliance with the License.
@@ -21,6 +22,6 @@ module Kitchen
21
22
  module Driver
22
23
 
23
24
  # Version string for EC2 Test Kitchen driver
24
- EC2_VERSION = "2.1.0"
25
+ EC2_VERSION = "2.2.0"
25
26
  end
26
27
  end
@@ -2,7 +2,8 @@
2
2
  #
3
3
  # Author:: Tyler Ball (<tball@chef.io>)
4
4
  #
5
- # Copyright (C) 2015, Fletcher Nichol
5
+ # Copyright:: 2015-2018, Fletcher Nichol
6
+ # Copyright:: 2016-2018, Chef Software, Inc.
6
7
  #
7
8
  # Licensed under the Apache License, Version 2.0 (the "License");
8
9
  # you may not use this file except in compliance with the License.
@@ -1,3 +1,19 @@
1
+ #
2
+ # Copyright:: 2015-2018, Fletcher Nichol
3
+ # Copyright:: 2016-2018, Chef Software, Inc.
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
+
1
17
  require "kitchen/driver/ec2"
2
18
  require "kitchen/provisioner/dummy"
3
19
  require "kitchen/transport/dummy"
@@ -2,7 +2,8 @@
2
2
  #
3
3
  # Author:: Tyler Ball (<tball@chef.io>)
4
4
  #
5
- # Copyright (C) 2015, Fletcher Nichol
5
+ # Copyright:: 2015-2018, Fletcher Nichol
6
+ # Copyright:: 2016-2018, Chef Software, Inc.
6
7
  #
7
8
  # Licensed under the Apache License, Version 2.0 (the "License");
8
9
  # you may not use this file except in compliance with the License.
@@ -336,25 +337,6 @@ describe Kitchen::Driver::Aws::InstanceGenerator do
336
337
  end
337
338
  end
338
339
 
339
- context "when tenancy is not supported" do
340
- let(:config) do
341
- {
342
- :region => "eu-east-1",
343
- :tenancy => "ephemeral",
344
- }
345
- end
346
- it "is not added to the instance data" do
347
- expect(generator.ec2_instance_data).to eq(
348
- :instance_type => nil,
349
- :ebs_optimized => nil,
350
- :image_id => nil,
351
- :key_name => nil,
352
- :subnet_id => nil,
353
- :private_ip_address => nil
354
- )
355
- end
356
- end
357
-
358
340
  context "when availability_zone and tenancy are provided" do
359
341
  let(:config) do
360
342
  {
@@ -397,25 +379,6 @@ describe Kitchen::Driver::Aws::InstanceGenerator do
397
379
  end
398
380
  end
399
381
 
400
- context "when tenancy is not supported" do
401
- let(:config) do
402
- {
403
- :region => "eu-east-1",
404
- :tenancy => "ephemeral",
405
- }
406
- end
407
- it "is not added to the instance data" do
408
- expect(generator.ec2_instance_data).to eq(
409
- :instance_type => nil,
410
- :ebs_optimized => nil,
411
- :image_id => nil,
412
- :key_name => nil,
413
- :subnet_id => nil,
414
- :private_ip_address => nil
415
- )
416
- end
417
- end
418
-
419
382
  context "when subnet_id is provided" do
420
383
  let(:config) do
421
384
  {
@@ -2,7 +2,8 @@
2
2
  #
3
3
  # Author:: Tyler Ball (<tball@chef.io>)
4
4
  #
5
- # Copyright (C) 2015, Fletcher Nichol
5
+ # Copyright:: 2015-2018, Fletcher Nichol
6
+ # Copyright:: 2016-2018, Chef Software, Inc.
6
7
  #
7
8
  # Licensed under the Apache License, Version 2.0 (the "License");
8
9
  # you may not use this file except in compliance with the License.
@@ -264,19 +265,50 @@ describe Kitchen::Driver::Ec2 do
264
265
  end
265
266
 
266
267
  describe "#tag_server" do
267
- it "tags the server" do
268
- config[:tags] = { :key1 => :value1, :key2 => :value2 }
269
- expect(server).to receive(:create_tags).with(
270
- :tags => [
271
- { :key => :key1, :value => :value1 },
272
- { :key => :key2, :value => :value2 },
273
- ]
274
- )
275
- driver.tag_server(server)
268
+ context "with no tags specified" do
269
+ it "does not raise" do
270
+ config[:tags] = nil
271
+ expect { driver.tag_server(server) }.not_to raise_error
272
+ end
273
+ end
274
+
275
+ context "with standard string tags" do
276
+ it "tags the server" do
277
+ config[:tags] = { :key1 => "value1", :key2 => "value2" }
278
+ expect(server).to receive(:create_tags).with(
279
+ :tags => [
280
+ { :key => :key1, :value => "value1" },
281
+ { :key => :key2, :value => "value2" },
282
+ ]
283
+ )
284
+ driver.tag_server(server)
285
+ end
276
286
  end
277
- it "does not raise" do
278
- config[:tags] = nil
279
- expect { driver.tag_server(server) }.not_to raise_error
287
+
288
+ context "with a tag that includes a Integer value" do
289
+ it "tags the server" do
290
+ config[:tags] = { :key1 => "value1", :key2 => 1 }
291
+ expect(server).to receive(:create_tags).with(
292
+ :tags => [
293
+ { :key => :key1, :value => "value1" },
294
+ { :key => :key2, :value => "1" },
295
+ ]
296
+ )
297
+ driver.tag_server(server)
298
+ end
299
+ end
300
+
301
+ context "with a tag that includes a Nil value" do
302
+ it "tags the server" do
303
+ config[:tags] = { :key1 => "value1", :key2 => nil }
304
+ expect(server).to receive(:create_tags).with(
305
+ :tags => [
306
+ { :key => :key1, :value => "value1" },
307
+ { :key => :key2, :value => "" },
308
+ ]
309
+ )
310
+ driver.tag_server(server)
311
+ end
280
312
  end
281
313
  end
282
314
 
@@ -285,15 +317,43 @@ describe Kitchen::Driver::Ec2 do
285
317
  before do
286
318
  allow(server).to receive(:volumes).and_return([volume])
287
319
  end
288
- it "tags the instance volumes" do
289
- config[:tags] = { :key1 => :value1, :key2 => :value2 }
290
- expect(volume).to receive(:create_tags).with(
291
- :tags => [
292
- { :key => :key1, :value => :value1 },
293
- { :key => :key2, :value => :value2 },
294
- ]
295
- )
296
- driver.tag_volumes(server)
320
+ context "with standard string tags" do
321
+ it "tags the instance volumes" do
322
+ config[:tags] = { :key1 => "value1", :key2 => "value2" }
323
+ expect(volume).to receive(:create_tags).with(
324
+ :tags => [
325
+ { :key => :key1, :value => "value1" },
326
+ { :key => :key2, :value => "value2" },
327
+ ]
328
+ )
329
+ driver.tag_volumes(server)
330
+ end
331
+ end
332
+
333
+ context "with a tag that includes a Integer value" do
334
+ it "tags the instance volumes" do
335
+ config[:tags] = { :key1 => "value1", :key2 => 2 }
336
+ expect(volume).to receive(:create_tags).with(
337
+ :tags => [
338
+ { :key => :key1, :value => "value1" },
339
+ { :key => :key2, :value => "2" },
340
+ ]
341
+ )
342
+ driver.tag_volumes(server)
343
+ end
344
+ end
345
+
346
+ context "with a tag that includes a Nil value" do
347
+ it "tags the instance volumes" do
348
+ config[:tags] = { :key1 => "value1", :key2 => nil }
349
+ expect(volume).to receive(:create_tags).with(
350
+ :tags => [
351
+ { :key => :key1, :value => "value1" },
352
+ { :key => :key2, :value => "" },
353
+ ]
354
+ )
355
+ driver.tag_volumes(server)
356
+ end
297
357
  end
298
358
  end
299
359
 
@@ -2,7 +2,8 @@
2
2
  #
3
3
  # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
4
4
  #
5
- # Copyright (C) 2015, Fletcher Nichol
5
+ # Copyright:: 2015-2018, Fletcher Nichol
6
+ # Copyright:: 2016-2018, Chef Software, Inc.
6
7
  #
7
8
  # Licensed under the Apache License, Version 2.0 (the "License");
8
9
  # you may not use this file except in compliance with the License.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitchen-ec2
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fletcher Nichol
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-27 00:00:00.000000000 Z
11
+ date: 2018-02-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-kitchen
@@ -148,14 +148,20 @@ dependencies:
148
148
  requirements:
149
149
  - - "~>"
150
150
  - !ruby/object:Gem::Version
151
- version: '0.8'
151
+ version: '0.9'
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: 0.9.11
152
155
  type: :development
153
156
  prerelease: false
154
157
  version_requirements: !ruby/object:Gem::Requirement
155
158
  requirements:
156
159
  - - "~>"
157
160
  - !ruby/object:Gem::Version
158
- version: '0.8'
161
+ version: '0.9'
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: 0.9.11
159
165
  - !ruby/object:Gem::Dependency
160
166
  name: chefstyle
161
167
  requirement: !ruby/object:Gem::Requirement
@@ -219,7 +225,7 @@ files:
219
225
  - spec/kitchen/driver/ec2/instance_generator_spec.rb
220
226
  - spec/kitchen/driver/ec2_spec.rb
221
227
  - spec/spec_helper.rb
222
- homepage: http://kitchen.ci/
228
+ homepage: https://kitchen.ci/
223
229
  licenses:
224
230
  - Apache 2.0
225
231
  metadata: {}