kitchen-ec2 3.7.0 → 3.10.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
  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