kitchen-ec2 3.7.0 → 3.10.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/aws/client.rb +0 -1
- data/lib/kitchen/driver/aws/instance_generator.rb +4 -5
- data/lib/kitchen/driver/aws/standard_platform.rb +2 -2
- data/lib/kitchen/driver/aws/standard_platform/amazon.rb +1 -1
- data/lib/kitchen/driver/aws/standard_platform/amazon2.rb +1 -1
- data/lib/kitchen/driver/aws/standard_platform/centos.rb +26 -3
- data/lib/kitchen/driver/aws/standard_platform/debian.rb +3 -3
- data/lib/kitchen/driver/aws/standard_platform/fedora.rb +1 -1
- data/lib/kitchen/driver/aws/standard_platform/freebsd.rb +1 -1
- data/lib/kitchen/driver/aws/standard_platform/rhel.rb +8 -1
- data/lib/kitchen/driver/aws/standard_platform/ubuntu.rb +1 -1
- data/lib/kitchen/driver/aws/standard_platform/windows.rb +1 -1
- data/lib/kitchen/driver/ec2.rb +81 -34
- data/lib/kitchen/driver/ec2_version.rb +1 -2
- metadata +6 -132
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b5acaa7d4d497244e97e35e4d8c44f1b0a8771100dfb0ef01cae937a7904a853
|
4
|
+
data.tar.gz: 92a4bb2ffeb6c84295fc6432e0c0852e63e11f1a4cbea7ae4fad54888ad9869e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb7fc3f4d93a893455e274f0744c510526a79c2bd997bf6ef712f9e7774ab13a077b2c038402d7c41eaf8610f7b0bff9abeddddc5633b36c2e1142bfe72c4779
|
7
|
+
data.tar.gz: 44f07e5fb729c8fd106e3df0030a7d267322ebd80220f19f115e2f8addc6148a1ebd5c2da05bb4e5f84867c74b1889a4131881183f8f89ed5f67bde776e7ac7d
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
1
|
#
|
3
2
|
# Author:: Tyler Ball (<tball@chef.io>)
|
4
3
|
#
|
@@ -17,7 +16,7 @@
|
|
17
16
|
# See the License for the specific language governing permissions and
|
18
17
|
# limitations under the License.
|
19
18
|
|
20
|
-
require "base64"
|
19
|
+
require "base64" unless defined?(Base64)
|
21
20
|
require "aws-sdk-ec2"
|
22
21
|
|
23
22
|
module Kitchen
|
@@ -59,7 +58,7 @@ module Kitchen
|
|
59
58
|
raise "The subnet tagged '#{config[:subnet_filter][:tag]}:#{config[:subnet_filter][:value]}' does not exist!" unless subnets.any?
|
60
59
|
|
61
60
|
# => Select the least-populated subnet if we have multiple matches
|
62
|
-
subnet = subnets.
|
61
|
+
subnet = subnets.max_by { |s| s[:available_ip_address_count] }
|
63
62
|
vpc_id = subnet.vpc_id
|
64
63
|
config[:subnet_id] = subnet.subnet_id
|
65
64
|
end
|
@@ -133,7 +132,7 @@ module Kitchen
|
|
133
132
|
|
134
133
|
availability_zone = config[:availability_zone]
|
135
134
|
if availability_zone
|
136
|
-
if
|
135
|
+
if /^[a-z]$/i.match?(availability_zone)
|
137
136
|
availability_zone = "#{config[:region]}#{availability_zone}"
|
138
137
|
end
|
139
138
|
i[:placement] = { availability_zone: availability_zone.downcase }
|
@@ -176,7 +175,7 @@ module Kitchen
|
|
176
175
|
end
|
177
176
|
availability_zone = config[:availability_zone]
|
178
177
|
if availability_zone
|
179
|
-
if
|
178
|
+
if /^[a-z]$/i.match?(availability_zone)
|
180
179
|
availability_zone = "#{config[:region]}#{availability_zone}"
|
181
180
|
end
|
182
181
|
i[:placement] = { availability_zone: availability_zone.downcase }
|
@@ -210,10 +210,10 @@ module Kitchen
|
|
210
210
|
images = images.sort_by(&:creation_date).reverse
|
211
211
|
# P5: We prefer x86_64 over i386 (if available)
|
212
212
|
images = prefer(images) { |image| image.architecture == "x86_64" }
|
213
|
-
# P4: We prefer
|
213
|
+
# P4: We prefer (SSD) (if available)
|
214
214
|
images = prefer(images) do |image|
|
215
215
|
image.block_device_mappings.any? do |b|
|
216
|
-
b.device_name == image.root_device_name && b.ebs && b.ebs.volume_type ==
|
216
|
+
b.device_name == image.root_device_name && b.ebs && %w{gp3 gp2}.any? { |t| b.ebs.volume_type == t }
|
217
217
|
end
|
218
218
|
end
|
219
219
|
# P3: We prefer ebs over instance_store (if available)
|
@@ -23,6 +23,14 @@ module Kitchen
|
|
23
23
|
class Centos < StandardPlatform
|
24
24
|
StandardPlatform.platforms["centos"] = self
|
25
25
|
|
26
|
+
CENTOS_OWNER_ID = "125523088429".freeze
|
27
|
+
PRODUCT_CODES = {
|
28
|
+
"6" => "6x5jmcajty9edm3f211pqjfn2",
|
29
|
+
"7" => "aw0evgkw8e5c1q413zgy5pjce",
|
30
|
+
# It appears that v8 is not published to the
|
31
|
+
# AWS marketplace and hence does not have a product code
|
32
|
+
}.freeze
|
33
|
+
|
26
34
|
# default username for this platform's ami
|
27
35
|
# @return [String]
|
28
36
|
def username
|
@@ -34,10 +42,25 @@ module Kitchen
|
|
34
42
|
end
|
35
43
|
|
36
44
|
def image_search
|
45
|
+
# Version 8+ are published directly, not to the AWS marketplace. Use OWNER ID.
|
37
46
|
search = {
|
38
|
-
"owner-
|
39
|
-
"name" => ["CentOS
|
47
|
+
"owner-id" => CENTOS_OWNER_ID,
|
48
|
+
"name" => ["CentOS #{version}*", "CentOS-#{version}*-GA-*"],
|
40
49
|
}
|
50
|
+
|
51
|
+
if version && version.split(".").first.to_i < 8
|
52
|
+
# Versions <8 are published to the AWS marketplace and use a different naming convention
|
53
|
+
search = {
|
54
|
+
"owner-alias" => "aws-marketplace",
|
55
|
+
"name" => ["CentOS Linux #{version}*", "CentOS-#{version}*-GA-*"],
|
56
|
+
}
|
57
|
+
# For versions published to aws-marketplace, additionally filter on product code to
|
58
|
+
# avoid non-official AMIs. Can't use CentOS owner ID here, as the owner ID is that of aws marketplace.
|
59
|
+
# https://github.com/test-kitchen/kitchen-ec2/issues/456
|
60
|
+
PRODUCT_CODES.keys.each do |major_version|
|
61
|
+
search["product-code"] = PRODUCT_CODES[major_version] if version.start_with?(major_version)
|
62
|
+
end
|
63
|
+
end
|
41
64
|
search["architecture"] = architecture if architecture
|
42
65
|
search
|
43
66
|
end
|
@@ -52,7 +75,7 @@ module Kitchen
|
|
52
75
|
end
|
53
76
|
|
54
77
|
def self.from_image(driver, image)
|
55
|
-
if
|
78
|
+
if /centos/i.match?(image.name)
|
56
79
|
image.name =~ /\b(\d+(\.\d+)?)\b/i
|
57
80
|
new(driver, "centos", (Regexp.last_match || [])[1], image.architecture)
|
58
81
|
end
|
@@ -23,8 +23,8 @@ module Kitchen
|
|
23
23
|
class Debian < StandardPlatform
|
24
24
|
StandardPlatform.platforms["debian"] = self
|
25
25
|
|
26
|
-
#
|
27
|
-
# and
|
26
|
+
# 11/12 are listed last since we default to the first item in the hash
|
27
|
+
# and 11/12 are not released yet. When they're released move them up
|
28
28
|
DEBIAN_CODENAMES = {
|
29
29
|
10 => "buster",
|
30
30
|
9 => "stretch",
|
@@ -60,7 +60,7 @@ module Kitchen
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def self.from_image(driver, image)
|
63
|
-
if
|
63
|
+
if /debian/i.match?(image.name)
|
64
64
|
image.name =~ /\b(\d+|#{DEBIAN_CODENAMES.values.join("|")})\b/i
|
65
65
|
version = (Regexp.last_match || [])[1]
|
66
66
|
if version && version.to_i == 0
|
@@ -45,11 +45,18 @@ module Kitchen
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def self.from_image(driver, image)
|
48
|
-
if
|
48
|
+
if /rhel/i.match?(image.name)
|
49
49
|
image.name =~ /\b(\d+(\.\d+)?)/i
|
50
50
|
new(driver, "rhel", (Regexp.last_match || [])[1], image.architecture)
|
51
51
|
end
|
52
52
|
end
|
53
|
+
|
54
|
+
def sort_by_version(images)
|
55
|
+
# First do a normal version sort
|
56
|
+
super(images)
|
57
|
+
# Now sort again, shunning Beta releases.
|
58
|
+
prefer(images) { |image| !image.name.match(/_Beta-/i) }
|
59
|
+
end
|
53
60
|
end
|
54
61
|
end
|
55
62
|
end
|
@@ -70,7 +70,7 @@ module Kitchen
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def self.from_image(driver, image)
|
73
|
-
if
|
73
|
+
if /Windows/i.match?(image.name)
|
74
74
|
# 2008 R2 SP2
|
75
75
|
if image.name =~ /(\b\d+)\W*(r\d+)?/i
|
76
76
|
major, revision = (Regexp.last_match || [])[1], (Regexp.last_match || [])[2]
|
data/lib/kitchen/driver/ec2.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
1
|
#
|
3
2
|
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
4
3
|
#
|
@@ -17,8 +16,8 @@
|
|
17
16
|
# See the License for the specific language governing permissions and
|
18
17
|
# limitations under the License.
|
19
18
|
|
20
|
-
require "benchmark"
|
21
|
-
require "json"
|
19
|
+
require "benchmark" unless defined?(Benchmark)
|
20
|
+
require "json" unless defined?(JSON)
|
22
21
|
require "kitchen"
|
23
22
|
require_relative "ec2_version"
|
24
23
|
require_relative "aws/client"
|
@@ -35,10 +34,10 @@ require_relative "aws/standard_platform/ubuntu"
|
|
35
34
|
require_relative "aws/standard_platform/windows"
|
36
35
|
require "aws-sdk-ec2"
|
37
36
|
require "aws-sdk-core/waiters/errors"
|
38
|
-
require "retryable"
|
39
|
-
require "time"
|
40
|
-
require "etc"
|
41
|
-
require "socket"
|
37
|
+
require "retryable" unless defined?(Retryable)
|
38
|
+
require "time" unless defined?(Time)
|
39
|
+
require "etc" unless defined?(Etc)
|
40
|
+
require "socket" unless defined?(Socket)
|
42
41
|
|
43
42
|
module Kitchen
|
44
43
|
|
@@ -57,7 +56,8 @@ module Kitchen
|
|
57
56
|
default_config :shared_credentials_profile, ENV["AWS_PROFILE"]
|
58
57
|
default_config :availability_zone, nil
|
59
58
|
default_config :instance_type, &:default_instance_type
|
60
|
-
default_config :ebs_optimized,
|
59
|
+
default_config :ebs_optimized, false
|
60
|
+
default_config :delete_on_termination, true
|
61
61
|
default_config :security_group_ids, nil
|
62
62
|
default_config :security_group_filter, nil
|
63
63
|
default_config :security_group_cidr_ip, "0.0.0.0/0"
|
@@ -261,13 +261,14 @@ module Kitchen
|
|
261
261
|
|
262
262
|
info("EC2 instance <#{state[:server_id]}> ready (hostname: #{state[:hostname]}).")
|
263
263
|
instance.transport.connection(state).wait_until_ready
|
264
|
-
|
264
|
+
attach_network_interface(state) unless config[:elastic_network_interface_id].nil?
|
265
|
+
create_ec2_json(state) if /chef/i.match?(instance.provisioner.name)
|
265
266
|
debug("ec2:create '#{state[:hostname]}'")
|
266
|
-
rescue Exception
|
267
|
+
rescue Exception => e
|
267
268
|
# Clean up any auto-created security groups or keys on the way out.
|
268
269
|
delete_security_group(state)
|
269
270
|
delete_key(state)
|
270
|
-
raise
|
271
|
+
raise "#{e.message} in the specified region #{config[:region]}. Please check this AMI is available in this region."
|
271
272
|
end
|
272
273
|
|
273
274
|
def destroy(state)
|
@@ -319,17 +320,14 @@ module Kitchen
|
|
319
320
|
end
|
320
321
|
|
321
322
|
def default_instance_type
|
322
|
-
@instance_type ||=
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
"t1.micro"
|
331
|
-
end
|
332
|
-
end
|
323
|
+
@instance_type ||= if image && image.virtualization_type == "hvm"
|
324
|
+
info("instance_type not specified. Using free tier t2.micro instance ...")
|
325
|
+
"t2.micro"
|
326
|
+
else
|
327
|
+
info("instance_type not specified. Using free tier t1.micro instance since" \
|
328
|
+
" image is paravirtual (pick an hvm image to use the superior t2.micro!) ...")
|
329
|
+
"t1.micro"
|
330
|
+
end
|
333
331
|
end
|
334
332
|
|
335
333
|
# The actual platform is the platform detected from the image
|
@@ -424,7 +422,31 @@ module Kitchen
|
|
424
422
|
def submit_spots
|
425
423
|
configs = [config]
|
426
424
|
expanded = []
|
427
|
-
keys = %i{instance_type
|
425
|
+
keys = %i{instance_type}
|
426
|
+
|
427
|
+
unless config[:subnet_filter]
|
428
|
+
# => Use explicitly specified subnets
|
429
|
+
keys << :subnet_id
|
430
|
+
else
|
431
|
+
# => Enable cascading through matching subnets
|
432
|
+
client = ::Aws::EC2::Client.new(region: config[:region])
|
433
|
+
subnets = client.describe_subnets(
|
434
|
+
filters: [
|
435
|
+
{
|
436
|
+
name: "tag:#{config[:subnet_filter][:tag]}",
|
437
|
+
values: [config[:subnet_filter][:value]],
|
438
|
+
},
|
439
|
+
]
|
440
|
+
).subnets
|
441
|
+
raise "A subnet matching '#{config[:subnet_filter][:tag]}:#{config[:subnet_filter][:value]}' does not exist!" unless subnets.any?
|
442
|
+
|
443
|
+
configs = subnets.map do |subnet|
|
444
|
+
new_config = config.clone
|
445
|
+
new_config[:subnet_id] = subnet.subnet_id
|
446
|
+
new_config[:subnet_filter] = nil
|
447
|
+
new_config
|
448
|
+
end
|
449
|
+
end
|
428
450
|
|
429
451
|
keys.each do |key|
|
430
452
|
configs.each do |conf|
|
@@ -436,12 +458,10 @@ module Kitchen
|
|
436
458
|
|
437
459
|
errs = []
|
438
460
|
configs.each do |conf|
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
errs.append(e)
|
444
|
-
end
|
461
|
+
@config = conf
|
462
|
+
return submit_spot
|
463
|
+
rescue => e
|
464
|
+
errs.append(e)
|
445
465
|
end
|
446
466
|
raise ["Could not create a spot instance:", errs].flatten.join("\n")
|
447
467
|
end
|
@@ -450,7 +470,6 @@ module Kitchen
|
|
450
470
|
debug("Creating EC2 Spot Instance..")
|
451
471
|
instance_data = instance_generator.ec2_instance_data
|
452
472
|
|
453
|
-
request_duration = config[:spot_wait]
|
454
473
|
config_spot_price = config[:spot_price].to_s
|
455
474
|
if %w{ondemand on-demand}.include?(config_spot_price)
|
456
475
|
spot_price = ""
|
@@ -458,9 +477,10 @@ module Kitchen
|
|
458
477
|
spot_price = config_spot_price
|
459
478
|
end
|
460
479
|
spot_options = {
|
461
|
-
|
462
|
-
|
463
|
-
instance_interruption_behavior
|
480
|
+
# Must use one-time in order to use instance_interruption_behavior=terminate
|
481
|
+
# spot_instance_type: "one-time", # default
|
482
|
+
# Must use instance_interruption_behavior=terminate in order to use block_duration_minutes
|
483
|
+
# instance_interruption_behavior: "terminate", # default
|
464
484
|
}
|
465
485
|
if config[:block_duration_minutes]
|
466
486
|
spot_options[:block_duration_minutes] = config[:block_duration_minutes]
|
@@ -762,7 +782,9 @@ module Kitchen
|
|
762
782
|
ip_protocol: "tcp",
|
763
783
|
from_port: port,
|
764
784
|
to_port: port,
|
765
|
-
ip_ranges:
|
785
|
+
ip_ranges: Array(config[:security_group_cidr_ip]).map do |cidr_ip|
|
786
|
+
{ cidr_ip: cidr_ip }
|
787
|
+
end,
|
766
788
|
}
|
767
789
|
end
|
768
790
|
)
|
@@ -803,6 +825,31 @@ module Kitchen
|
|
803
825
|
state[:ssh_key] = key_path
|
804
826
|
end
|
805
827
|
|
828
|
+
def attach_network_interface(state)
|
829
|
+
info("Attaching Network interface <#{config[:elastic_network_interface_id]}> with the instance <#{state[:server_id]}> .")
|
830
|
+
client = ::Aws::EC2::Client.new(region: config[:region])
|
831
|
+
begin
|
832
|
+
check_eni = client.describe_network_interface_attribute({
|
833
|
+
attribute: "attachment",
|
834
|
+
network_interface_id: config[:elastic_network_interface_id],
|
835
|
+
})
|
836
|
+
if check_eni.attachment.nil?
|
837
|
+
unless state[:server_id].nil?
|
838
|
+
client.attach_network_interface({
|
839
|
+
device_index: 1,
|
840
|
+
instance_id: state[:server_id],
|
841
|
+
network_interface_id: config[:elastic_network_interface_id],
|
842
|
+
})
|
843
|
+
info("Attached Network interface <#{config[:elastic_network_interface_id]}> with the instance <#{state[:server_id]}> .")
|
844
|
+
end
|
845
|
+
else
|
846
|
+
puts "ENI #{config[:elastic_network_interface_id]} already attached."
|
847
|
+
end
|
848
|
+
rescue ::Aws::EC2::Errors::InvalidNetworkInterfaceIDNotFound => e
|
849
|
+
warn("#{e}")
|
850
|
+
end
|
851
|
+
end
|
852
|
+
|
806
853
|
# Clean up a temporary security group for this instance.
|
807
854
|
#
|
808
855
|
# @api private
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
1
|
#
|
3
2
|
# Author:: Fletcher Nichol (<fnichol@nichol.ca>)
|
4
3
|
#
|
@@ -22,6 +21,6 @@ module Kitchen
|
|
22
21
|
module Driver
|
23
22
|
|
24
23
|
# Version string for EC2 Test Kitchen driver
|
25
|
-
EC2_VERSION = "3.
|
24
|
+
EC2_VERSION = "3.10.0".freeze
|
26
25
|
end
|
27
26
|
end
|
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: 3.
|
4
|
+
version: 3.10.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:
|
11
|
+
date: 2021-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: test-kitchen
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: 1.4.1
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '4'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,35 +29,7 @@ dependencies:
|
|
29
29
|
version: 1.4.1
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
33
|
-
- !ruby/object:Gem::Dependency
|
34
|
-
name: excon
|
35
|
-
requirement: !ruby/object:Gem::Requirement
|
36
|
-
requirements:
|
37
|
-
- - ">="
|
38
|
-
- !ruby/object:Gem::Version
|
39
|
-
version: '0'
|
40
|
-
type: :runtime
|
41
|
-
prerelease: false
|
42
|
-
version_requirements: !ruby/object:Gem::Requirement
|
43
|
-
requirements:
|
44
|
-
- - ">="
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '0'
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: multi_json
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
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
|
-
requirements:
|
58
|
-
- - ">="
|
59
|
-
- !ruby/object:Gem::Version
|
60
|
-
version: '0'
|
32
|
+
version: '4'
|
61
33
|
- !ruby/object:Gem::Dependency
|
62
34
|
name: aws-sdk-ec2
|
63
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -92,104 +64,6 @@ dependencies:
|
|
92
64
|
- - "<"
|
93
65
|
- !ruby/object:Gem::Version
|
94
66
|
version: '4.0'
|
95
|
-
- !ruby/object:Gem::Dependency
|
96
|
-
name: rspec
|
97
|
-
requirement: !ruby/object:Gem::Requirement
|
98
|
-
requirements:
|
99
|
-
- - "~>"
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: '3.2'
|
102
|
-
type: :development
|
103
|
-
prerelease: false
|
104
|
-
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
requirements:
|
106
|
-
- - "~>"
|
107
|
-
- !ruby/object:Gem::Version
|
108
|
-
version: '3.2'
|
109
|
-
- !ruby/object:Gem::Dependency
|
110
|
-
name: countloc
|
111
|
-
requirement: !ruby/object:Gem::Requirement
|
112
|
-
requirements:
|
113
|
-
- - "~>"
|
114
|
-
- !ruby/object:Gem::Version
|
115
|
-
version: '0.4'
|
116
|
-
type: :development
|
117
|
-
prerelease: false
|
118
|
-
version_requirements: !ruby/object:Gem::Requirement
|
119
|
-
requirements:
|
120
|
-
- - "~>"
|
121
|
-
- !ruby/object:Gem::Version
|
122
|
-
version: '0.4'
|
123
|
-
- !ruby/object:Gem::Dependency
|
124
|
-
name: maruku
|
125
|
-
requirement: !ruby/object:Gem::Requirement
|
126
|
-
requirements:
|
127
|
-
- - "~>"
|
128
|
-
- !ruby/object:Gem::Version
|
129
|
-
version: '0.6'
|
130
|
-
type: :development
|
131
|
-
prerelease: false
|
132
|
-
version_requirements: !ruby/object:Gem::Requirement
|
133
|
-
requirements:
|
134
|
-
- - "~>"
|
135
|
-
- !ruby/object:Gem::Version
|
136
|
-
version: '0.6'
|
137
|
-
- !ruby/object:Gem::Dependency
|
138
|
-
name: simplecov
|
139
|
-
requirement: !ruby/object:Gem::Requirement
|
140
|
-
requirements:
|
141
|
-
- - "~>"
|
142
|
-
- !ruby/object:Gem::Version
|
143
|
-
version: '0.7'
|
144
|
-
type: :development
|
145
|
-
prerelease: false
|
146
|
-
version_requirements: !ruby/object:Gem::Requirement
|
147
|
-
requirements:
|
148
|
-
- - "~>"
|
149
|
-
- !ruby/object:Gem::Version
|
150
|
-
version: '0.7'
|
151
|
-
- !ruby/object:Gem::Dependency
|
152
|
-
name: yard
|
153
|
-
requirement: !ruby/object:Gem::Requirement
|
154
|
-
requirements:
|
155
|
-
- - ">="
|
156
|
-
- !ruby/object:Gem::Version
|
157
|
-
version: 0.9.11
|
158
|
-
type: :development
|
159
|
-
prerelease: false
|
160
|
-
version_requirements: !ruby/object:Gem::Requirement
|
161
|
-
requirements:
|
162
|
-
- - ">="
|
163
|
-
- !ruby/object:Gem::Version
|
164
|
-
version: 0.9.11
|
165
|
-
- !ruby/object:Gem::Dependency
|
166
|
-
name: chefstyle
|
167
|
-
requirement: !ruby/object:Gem::Requirement
|
168
|
-
requirements:
|
169
|
-
- - '='
|
170
|
-
- !ruby/object:Gem::Version
|
171
|
-
version: 1.1.2
|
172
|
-
type: :development
|
173
|
-
prerelease: false
|
174
|
-
version_requirements: !ruby/object:Gem::Requirement
|
175
|
-
requirements:
|
176
|
-
- - '='
|
177
|
-
- !ruby/object:Gem::Version
|
178
|
-
version: 1.1.2
|
179
|
-
- !ruby/object:Gem::Dependency
|
180
|
-
name: climate_control
|
181
|
-
requirement: !ruby/object:Gem::Requirement
|
182
|
-
requirements:
|
183
|
-
- - ">="
|
184
|
-
- !ruby/object:Gem::Version
|
185
|
-
version: '0'
|
186
|
-
type: :development
|
187
|
-
prerelease: false
|
188
|
-
version_requirements: !ruby/object:Gem::Requirement
|
189
|
-
requirements:
|
190
|
-
- - ">="
|
191
|
-
- !ruby/object:Gem::Version
|
192
|
-
version: '0'
|
193
67
|
description: A Test Kitchen Driver for Amazon EC2
|
194
68
|
email:
|
195
69
|
- fnichol@nichol.ca
|
@@ -224,14 +98,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
224
98
|
requirements:
|
225
99
|
- - ">="
|
226
100
|
- !ruby/object:Gem::Version
|
227
|
-
version: '2.
|
101
|
+
version: '2.5'
|
228
102
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
229
103
|
requirements:
|
230
104
|
- - ">="
|
231
105
|
- !ruby/object:Gem::Version
|
232
106
|
version: '0'
|
233
107
|
requirements: []
|
234
|
-
rubygems_version: 3.
|
108
|
+
rubygems_version: 3.2.15
|
235
109
|
signing_key:
|
236
110
|
specification_version: 4
|
237
111
|
summary: A Test Kitchen Driver for Amazon EC2
|