kitchen-ec2 3.7.2 → 3.10.1

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: 0f0f97881aef017104ee3af2f9577a1303495d3f29dd46a8cf22c491e179022b
4
- data.tar.gz: caf442b23b9b8ed51149f9ca5af1aaa41112d47b21ac6e2b00e3167d21506ad2
3
+ metadata.gz: 9bf47b3328885d0439de770cf9e683fb9bddbab66b0d0bf40f6ab17190c7cf15
4
+ data.tar.gz: 0e384572b5d252a367c9dd689f48d64764e4540a3ccba34399402eeca7a80226
5
5
  SHA512:
6
- metadata.gz: 9e017c01b5a5a9ef3c811c92016bd72c83d108dd08836ed55fc4ee689f63813768f9b9c9a70131be64d29e89c0f1eb1c88951c7ff0c3ae01177f9cd56fb30029
7
- data.tar.gz: f020ac63fb41ee6b51b1829ec2a8b5122876ebfb8c0bca669b1872fc9e5a5108f332b02d3de2b008d079c7833bb6fee68957249fbbebfa7b30ab062c6ce50b12
6
+ metadata.gz: 2dba5e5835f48d9505a967b7d1c64f76cfd70532a6956f8c8bada246814f5affa0ebfc09176354e7f719663347056f3332176489e64b8471f073cb2452f055f6
7
+ data.tar.gz: 787c72dc701db53331e399c0080d0bcce09d9657e8814bddf3d359186ed30d409391c068b545b09dbce9a527d0fcb793d3a79197058933f5f40d3d2dd21fcbeb
@@ -75,6 +75,13 @@ module Kitchen
75
75
  ).to_a[0]
76
76
  end
77
77
 
78
+ # check if instance exists, given an id
79
+ # @param id [String] aws instance id
80
+ # @return boolean
81
+ def instance_exists?(id)
82
+ resource.instance(id).exists?
83
+ end
84
+
78
85
  def client
79
86
  @client ||= ::Aws::EC2::Client.new
80
87
  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",
@@ -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)
@@ -56,7 +56,8 @@ module Kitchen
56
56
  default_config :shared_credentials_profile, ENV["AWS_PROFILE"]
57
57
  default_config :availability_zone, nil
58
58
  default_config :instance_type, &:default_instance_type
59
- default_config :ebs_optimized, false
59
+ default_config :ebs_optimized, false
60
+ default_config :delete_on_termination, true
60
61
  default_config :security_group_ids, nil
61
62
  default_config :security_group_filter, nil
62
63
  default_config :security_group_cidr_ip, "0.0.0.0/0"
@@ -260,13 +261,14 @@ module Kitchen
260
261
 
261
262
  info("EC2 instance <#{state[:server_id]}> ready (hostname: #{state[:hostname]}).")
262
263
  instance.transport.connection(state).wait_until_ready
264
+ attach_network_interface(state) unless config[:elastic_network_interface_id].nil?
263
265
  create_ec2_json(state) if /chef/i.match?(instance.provisioner.name)
264
266
  debug("ec2:create '#{state[:hostname]}'")
265
- rescue Exception
267
+ rescue Exception => e
266
268
  # Clean up any auto-created security groups or keys on the way out.
267
269
  delete_security_group(state)
268
270
  delete_key(state)
269
- raise
271
+ raise "#{e.message} in the specified region #{config[:region]}. Please check this AMI is available in this region."
270
272
  end
271
273
 
272
274
  def destroy(state)
@@ -283,7 +285,7 @@ module Kitchen
283
285
  # If we are going to clean up an automatic security group, we need
284
286
  # to wait for the instance to shut down. This slightly breaks the
285
287
  # subsystem encapsulation, sorry not sorry.
286
- if state[:auto_security_group_id] && server
288
+ if state[:auto_security_group_id] && server && ec2.instance_exists?(state[:server_id])
287
289
  server.wait_until_terminated do |waiter|
288
290
  waiter.max_attempts = config[:retryable_tries]
289
291
  waiter.delay = config[:retryable_sleep]
@@ -318,17 +320,14 @@ module Kitchen
318
320
  end
319
321
 
320
322
  def default_instance_type
321
- @instance_type ||= begin
322
- # We default to the free tier (t2.micro for hvm, t1.micro for paravirtual)
323
- 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
331
- 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
332
331
  end
333
332
 
334
333
  # The actual platform is the platform detected from the image
@@ -459,12 +458,10 @@ module Kitchen
459
458
 
460
459
  errs = []
461
460
  configs.each do |conf|
462
- begin
463
- @config = conf
464
- return submit_spot
465
- rescue => e
466
- errs.append(e)
467
- end
461
+ @config = conf
462
+ return submit_spot
463
+ rescue => e
464
+ errs.append(e)
468
465
  end
469
466
  raise ["Could not create a spot instance:", errs].flatten.join("\n")
470
467
  end
@@ -473,7 +470,6 @@ module Kitchen
473
470
  debug("Creating EC2 Spot Instance..")
474
471
  instance_data = instance_generator.ec2_instance_data
475
472
 
476
- request_duration = config[:spot_wait]
477
473
  config_spot_price = config[:spot_price].to_s
478
474
  if %w{ondemand on-demand}.include?(config_spot_price)
479
475
  spot_price = ""
@@ -481,9 +477,10 @@ module Kitchen
481
477
  spot_price = config_spot_price
482
478
  end
483
479
  spot_options = {
484
- spot_instance_type: "persistent", # Cannot use one-time with valid_until
485
- valid_until: Time.now + request_duration,
486
- 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
487
484
  }
488
485
  if config[:block_duration_minutes]
489
486
  spot_options[:block_duration_minutes] = config[:block_duration_minutes]
@@ -785,7 +782,9 @@ module Kitchen
785
782
  ip_protocol: "tcp",
786
783
  from_port: port,
787
784
  to_port: port,
788
- 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,
789
788
  }
790
789
  end
791
790
  )
@@ -826,6 +825,31 @@ module Kitchen
826
825
  state[:ssh_key] = key_path
827
826
  end
828
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
+
829
853
  # Clean up a temporary security group for this instance.
830
854
  #
831
855
  # @api private
@@ -21,6 +21,6 @@ module Kitchen
21
21
  module Driver
22
22
 
23
23
  # Version string for EC2 Test Kitchen driver
24
- EC2_VERSION = "3.7.2".freeze
24
+ EC2_VERSION = "3.10.1".freeze
25
25
  end
26
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.2
4
+ version: 3.10.1
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-09-29 00:00:00.000000000 Z
11
+ date: 2021-10-28 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,7 +29,7 @@ dependencies:
29
29
  version: 1.4.1
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '3'
32
+ version: '4'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: aws-sdk-ec2
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -64,90 +64,6 @@ dependencies:
64
64
  - - "<"
65
65
  - !ruby/object:Gem::Version
66
66
  version: '4.0'
67
- - !ruby/object:Gem::Dependency
68
- name: rspec
69
- requirement: !ruby/object:Gem::Requirement
70
- requirements:
71
- - - "~>"
72
- - !ruby/object:Gem::Version
73
- version: '3.2'
74
- type: :development
75
- prerelease: false
76
- version_requirements: !ruby/object:Gem::Requirement
77
- requirements:
78
- - - "~>"
79
- - !ruby/object:Gem::Version
80
- version: '3.2'
81
- - !ruby/object:Gem::Dependency
82
- name: countloc
83
- requirement: !ruby/object:Gem::Requirement
84
- requirements:
85
- - - "~>"
86
- - !ruby/object:Gem::Version
87
- version: '0.4'
88
- type: :development
89
- prerelease: false
90
- version_requirements: !ruby/object:Gem::Requirement
91
- requirements:
92
- - - "~>"
93
- - !ruby/object:Gem::Version
94
- version: '0.4'
95
- - !ruby/object:Gem::Dependency
96
- name: maruku
97
- requirement: !ruby/object:Gem::Requirement
98
- requirements:
99
- - - "~>"
100
- - !ruby/object:Gem::Version
101
- version: '0.6'
102
- type: :development
103
- prerelease: false
104
- version_requirements: !ruby/object:Gem::Requirement
105
- requirements:
106
- - - "~>"
107
- - !ruby/object:Gem::Version
108
- version: '0.6'
109
- - !ruby/object:Gem::Dependency
110
- name: yard
111
- requirement: !ruby/object:Gem::Requirement
112
- requirements:
113
- - - ">="
114
- - !ruby/object:Gem::Version
115
- version: 0.9.11
116
- type: :development
117
- prerelease: false
118
- version_requirements: !ruby/object:Gem::Requirement
119
- requirements:
120
- - - ">="
121
- - !ruby/object:Gem::Version
122
- version: 0.9.11
123
- - !ruby/object:Gem::Dependency
124
- name: chefstyle
125
- requirement: !ruby/object:Gem::Requirement
126
- requirements:
127
- - - '='
128
- - !ruby/object:Gem::Version
129
- version: 1.4.0
130
- type: :development
131
- prerelease: false
132
- version_requirements: !ruby/object:Gem::Requirement
133
- requirements:
134
- - - '='
135
- - !ruby/object:Gem::Version
136
- version: 1.4.0
137
- - !ruby/object:Gem::Dependency
138
- name: climate_control
139
- requirement: !ruby/object:Gem::Requirement
140
- requirements:
141
- - - ">="
142
- - !ruby/object:Gem::Version
143
- version: '0'
144
- type: :development
145
- prerelease: false
146
- version_requirements: !ruby/object:Gem::Requirement
147
- requirements:
148
- - - ">="
149
- - !ruby/object:Gem::Version
150
- version: '0'
151
67
  description: A Test Kitchen Driver for Amazon EC2
152
68
  email:
153
69
  - fnichol@nichol.ca
@@ -182,14 +98,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
182
98
  requirements:
183
99
  - - ">="
184
100
  - !ruby/object:Gem::Version
185
- version: '2.4'
101
+ version: '2.5'
186
102
  required_rubygems_version: !ruby/object:Gem::Requirement
187
103
  requirements:
188
104
  - - ">="
189
105
  - !ruby/object:Gem::Version
190
106
  version: '0'
191
107
  requirements: []
192
- rubygems_version: 3.1.2
108
+ rubygems_version: 3.2.22
193
109
  signing_key:
194
110
  specification_version: 4
195
111
  summary: A Test Kitchen Driver for Amazon EC2