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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0d6429e51c08d43c0e1084b9acc55b76feacae05bbe42b7cf3a1e35e0de70f87
4
- data.tar.gz: 9f2a0adbe2866ad6a267ab8adc14d24a890b22b71b0abe272808a2a52def3933
3
+ metadata.gz: b5acaa7d4d497244e97e35e4d8c44f1b0a8771100dfb0ef01cae937a7904a853
4
+ data.tar.gz: 92a4bb2ffeb6c84295fc6432e0c0852e63e11f1a4cbea7ae4fad54888ad9869e
5
5
  SHA512:
6
- metadata.gz: aa308480b37d109ec173851aefe0098523d2a59c06481e88004bf76ccb8d87dfbd865300d2383157af13b38af47588ec2d1adf0541734f7279669a8dbcb0b673
7
- data.tar.gz: 48f6f1a3dc22caf5d04079ef1579c19850e7e72558708e633537adb752969c3aac1b79702804864fac3fad9140e8d9053347c3ecde47e578e0545366d0b0b619
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
  #
@@ -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.sort_by { |s| s[:available_ip_address_count] }.last
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 availability_zone =~ /^[a-z]$/i
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 availability_zone =~ /^[a-z]$/i
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 gp2 (SSD) (if available)
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 == "gp2"
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)
@@ -39,7 +39,7 @@ module Kitchen
39
39
  end
40
40
 
41
41
  def self.from_image(driver, image)
42
- if image.name =~ /amzn-ami/i
42
+ if /amzn-ami/i.match?(image.name)
43
43
  image.name =~ /\b(\d+(\.\d+[\.\d])?)/i
44
44
  new(driver, "amazon", (Regexp.last_match || [])[1], image.architecture)
45
45
  end
@@ -39,7 +39,7 @@ module Kitchen
39
39
  end
40
40
 
41
41
  def self.from_image(driver, image)
42
- if image.name =~ /amzn2-ami/i
42
+ if /amzn2-ami/i.match?(image.name)
43
43
  image.name =~ /\b(\d+(\.\d+[\.\d])?)/i
44
44
  new(driver, "amazon2", (Regexp.last_match || [])[1], image.architecture)
45
45
  end
@@ -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-alias" => "aws-marketplace",
39
- "name" => ["CentOS Linux #{version}*", "CentOS-#{version}*-GA-*"],
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 image.name =~ /centos/i
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
- # 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
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 image.name =~ /debian/i
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
@@ -39,7 +39,7 @@ module Kitchen
39
39
  end
40
40
 
41
41
  def self.from_image(driver, image)
42
- if image.name =~ /fedora/i
42
+ if /fedora/i.match?(image.name)
43
43
  image.name =~ /\b(\d+(\.\d+)?)\b/i
44
44
  new(driver, "fedora", (Regexp.last_match || [])[1], image.architecture)
45
45
  end
@@ -41,7 +41,7 @@ module Kitchen
41
41
  end
42
42
 
43
43
  def self.from_image(driver, image)
44
- if image.name =~ /freebsd/i
44
+ if /freebsd/i.match?(image.name)
45
45
  image.name =~ /\b(\d+(\.\d+)?)\b/i
46
46
  new(driver, "freebsd", (Regexp.last_match || [])[1], image.architecture)
47
47
  end
@@ -45,11 +45,18 @@ module Kitchen
45
45
  end
46
46
 
47
47
  def self.from_image(driver, image)
48
- if image.name =~ /rhel/i
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
@@ -39,7 +39,7 @@ module Kitchen
39
39
  end
40
40
 
41
41
  def self.from_image(driver, image)
42
- if image.name =~ /ubuntu/i
42
+ if /ubuntu/i.match?(image.name)
43
43
  image.name =~ /\b(\d+(\.\d+)?)\b/i
44
44
  new(driver, "ubuntu", (Regexp.last_match || [])[1], image.architecture)
45
45
  end
@@ -70,7 +70,7 @@ module Kitchen
70
70
  end
71
71
 
72
72
  def self.from_image(driver, image)
73
- if image.name =~ /Windows/i
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]
@@ -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, false
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
- create_ec2_json(state) if instance.provisioner.name =~ /chef/i
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 ||= begin
323
- # We default to the free tier (t2.micro for hvm, t1.micro for paravirtual)
324
- if image && image.virtualization_type == "hvm"
325
- info("instance_type not specified. Using free tier t2.micro instance ...")
326
- "t2.micro"
327
- else
328
- info("instance_type not specified. Using free tier t1.micro instance since" \
329
- " image is paravirtual (pick an hvm image to use the superior t2.micro!) ...")
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 subnet_id}
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
- begin
440
- @config = conf
441
- return submit_spot
442
- rescue => e
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
- spot_instance_type: "persistent", # Cannot use one-time with valid_until
462
- valid_until: Time.now + request_duration,
463
- instance_interruption_behavior: "stop",
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: [{ cidr_ip: config[:security_group_cidr_ip] }],
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.7.0".freeze
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.7.0
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: 2020-07-02 00:00:00.000000000 Z
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: '3'
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: '3'
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.4'
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.1.2
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