kitchen-ec2 3.8.0 → 3.11.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: 34d9b99c9fe048be513d606f50abb1318d6aa71541fa720308770311d1066a75
4
- data.tar.gz: abb3e57324a99271ade0ea238ac759e0790934b727729d74ab6cc7f0887f6997
3
+ metadata.gz: 862c1fd03a10f0ad6125f5ea8f5126bf5660e1b7050f9b550001bc7ab9302d91
4
+ data.tar.gz: f093d5cf16248830e3ab5aa1567354567bf6568e2a9b8d40d5fe5be4711c915f
5
5
  SHA512:
6
- metadata.gz: f829ebf7964c3588642d6cfd20ca78152098bc3ed700ca839d443c934b46b5ee61afcb7ee713ef2b2cc4acc9921d550c03e1de2914be3265852d56b554bbe050
7
- data.tar.gz: 9600e83fcde5acf5e9e98b91cf9e44033fa1aa405aec192ee5774fc1ea6ec4afc8f03cb485be8766a1f0804a4ab9a349f8353851c92348a53c60f8b5c3f3a2c5
6
+ metadata.gz: 3dbea4d3b992f1aebb989f8e894e040ed281d877694474a62afe67ceb4335e18e49463b3039b0c7996ad868f6fda843ff30a625fa92fb479912a4f552b591d23
7
+ data.tar.gz: 2367f3182eae5baee7e1b86785961b8f54c0820f9a7bfe35e7e1f8ef3f3731514eb5384166a1229f064df02246208d46950173611537d4868b1ff2883d5577e8
@@ -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,16 +23,17 @@ 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
+ # 12/13 are listed last since we default to the first item in the hash
27
+ # and 12/13 are not released yet. When they're released move them up
28
28
  DEBIAN_CODENAMES = {
29
+ 11 => "bullseye",
29
30
  10 => "buster",
30
31
  9 => "stretch",
31
32
  8 => "jessie",
32
33
  7 => "wheezy",
33
34
  6 => "squeeze",
34
- 11 => "bullseye",
35
35
  12 => "bookworm",
36
+ 13 => "trixie",
36
37
  }.freeze
37
38
 
38
39
  # default username for this platform's ami
@@ -51,11 +52,23 @@ module Kitchen
51
52
  end
52
53
 
53
54
  def image_search
54
- search = {
55
- "owner-id" => "379101102735",
56
- "name" => "debian-#{codename}-*",
57
- }
55
+ search = {}
56
+
57
+ # The Debian AWS owner ID changed for releases 10 and onwards
58
+ # See https://wiki.debian.org/Amazon/EC2/HowTo/awscli
59
+ if version.nil?
60
+ search["owner-id"] = "136693071363"
61
+ search["name"] = "debian-#{DEBIAN_CODENAMES.keys.first}-*"
62
+ elsif version.to_i >= 10
63
+ search["owner-id"] = "136693071363"
64
+ search["name"] = "debian-#{version.to_i}-*"
65
+ else
66
+ search["owner-id"] = "379101102735"
67
+ search["name"] = "debian-#{codename}-*"
68
+ end
69
+
58
70
  search["architecture"] = architecture if architecture
71
+
59
72
  search
60
73
  end
61
74
 
@@ -134,7 +134,7 @@ module Kitchen
134
134
 
135
135
  def windows_name_filter # rubocop:disable Metrics/MethodLength
136
136
  major, revision, service_pack = windows_version_parts
137
- if major == 2019 || major == 2016
137
+ if major == 2022 || major == 2019 || major == 2016
138
138
  "Windows_Server-#{major}-English-Full-Base-*"
139
139
  elsif major == 1709 || major == 1803
140
140
  "Windows_Server-#{major}-English-Core-ContainersLatest-*"
@@ -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
@@ -828,6 +825,31 @@ module Kitchen
828
825
  state[:ssh_key] = key_path
829
826
  end
830
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
+
831
853
  # Clean up a temporary security group for this instance.
832
854
  #
833
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.8.0".freeze
24
+ EC2_VERSION = "3.11.0".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.8.0
4
+ version: 3.11.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-10-14 00:00:00.000000000 Z
11
+ date: 2021-11-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,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.4
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.4
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.6'
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.4
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