kitchen-ec2 3.8.0 → 3.11.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: 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