kitchen-ec2 3.0.1 → 3.1.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: 5bc71d150397e78c72c0e48f96d8eebf93ee227bb67cce40098a4e0849f90b06
4
- data.tar.gz: 9a6dbe12a9e3d4dff4f1be3b261853947dddccc9efd8ee48527da3d50fb1d9f7
3
+ metadata.gz: 0cbb5b5baa43b4a35611f1fce155cf03e02112a442c9b6a92f76cda3ba429114
4
+ data.tar.gz: 1e9ebf93508345571c1805727e9bc2f978562e66d54ee1d92574252dc259b180
5
5
  SHA512:
6
- metadata.gz: a43e3f090636c341507d99c45fa488659133c7d322f65c19593d17ae0b3f4db62140999571d2ea5233d76d7bcfc3bf3ad08ddb88f58cd6e032f03df25283d229
7
- data.tar.gz: 4ce417d3f551c5eb7ca892b745255922deaf2ca5a88d20ebe6aba1ba2d0bd3b46b70408d9affbb5ff6716efd51b3bcff81f3bd3eafb473f8f124d8117478ed60
6
+ metadata.gz: 3781bd12154cb007e3d4ef735862b6411aad1f0923a994815d308507d765e8924d927a9d520649e7ab5a2c12227fe3ba775e5fdd5b78f2c844d743ec59b8cebc
7
+ data.tar.gz: 83a7d1855e0f8224f6844aa9fe4cb2342106a7966bf7fbd463606a39b8ae38b3e43e894ee8a2d1a5b35c5507f02055203ed4bdbb74505e2feb2f653a3cb14607
@@ -62,22 +62,37 @@ module Kitchen
62
62
  end
63
63
 
64
64
  if config[:security_group_ids].nil? && config[:security_group_filter]
65
- security_group = ::Aws::EC2::Client
66
- .new(region: config[:region]).describe_security_groups(
67
- filters: [
68
- {
69
- name: "tag:#{config[:security_group_filter][:tag]}",
70
- values: [config[:security_group_filter][:value]],
71
- },
65
+ security_groups = []
66
+ filters = [config[:security_group_filter]].flatten
67
+ filters.each do |sg_filter|
68
+ r = {}
69
+ if sg_filter[:name]
70
+ r[:filters] = [
71
+ {
72
+ name: "group-name",
73
+ values: [sg_filter[:name]],
74
+ },
72
75
  ]
73
- )[0][0]
76
+ end
74
77
 
75
- if security_group
76
- config[:security_group_ids] = [security_group.group_id]
77
- else
78
- raise "The group tagged '#{config[:security_group_filter][:tag]} " +
79
- "#{config[:security_group_filter][:value]}' does not exist!"
78
+ if sg_filter[:tag]
79
+ r[:filters] = [
80
+ {
81
+ name: "tag:#{sg_filter[:tag]}",
82
+ values: [sg_filter[:value]],
83
+ },
84
+ ]
85
+ end
86
+
87
+ security_group = ::Aws::EC2::Client.new(region: config[:region]).describe_security_groups(r)[0][0]
88
+
89
+ if security_group
90
+ security_groups.push(security_group.group_id)
91
+ else
92
+ raise "A Security Group matching the following filter could not be found:\n#{sg_filter}"
93
+ end
80
94
  end
95
+ config[:security_group_ids] = security_groups
81
96
  end
82
97
 
83
98
  i = {
@@ -74,6 +74,7 @@ module Kitchen
74
74
  default_config :spot_price, nil
75
75
  default_config :block_duration_minutes, nil
76
76
  default_config :retryable_tries, 60
77
+ default_config :spot_wait, 60
77
78
  default_config :retryable_sleep, 5
78
79
  default_config :aws_access_key_id, nil
79
80
  default_config :aws_secret_access_key, nil
@@ -229,18 +230,15 @@ module Kitchen
229
230
 
230
231
  if config[:spot_price]
231
232
  # Spot instance when a price is set
232
- server = with_request_limit_backoff(state) { submit_spot(state) }
233
+ server = with_request_limit_backoff(state) { submit_spots(state) }
233
234
  else
234
235
  # On-demand instance
235
236
  server = with_request_limit_backoff(state) { submit_server }
236
237
  end
237
238
  info("Instance <#{server.id}> requested.")
238
239
  with_request_limit_backoff(state) do
239
- server.wait_until_exists do |w|
240
- w.before_attempt do |attempts|
241
- info("Polling AWS for existence, attempt #{attempts}...")
242
- end
243
- end
240
+ logging_proc = ->(attempts) { info("Polling AWS for existence, attempt #{attempts}...") }
241
+ server.wait_until_exists(before_attempt: logging_proc)
244
242
  end
245
243
 
246
244
  # See https://github.com/aws/aws-sdk-ruby/issues/859
@@ -407,7 +405,7 @@ module Kitchen
407
405
  end
408
406
 
409
407
  def instance_generator
410
- @instance_generator ||= Aws::InstanceGenerator.new(config, ec2, instance.logger)
408
+ @instance_generator = Aws::InstanceGenerator.new(config, ec2, instance.logger)
411
409
  end
412
410
 
413
411
  # Fog AWS helper for creating the instance
@@ -422,6 +420,53 @@ module Kitchen
422
420
  ec2.create_instance(instance_data)
423
421
  end
424
422
 
423
+ def config
424
+ return super unless @config
425
+ @config
426
+ end
427
+
428
+ # Take one config and expand to multiple configs
429
+ def expand_config(conf, key)
430
+ configs = []
431
+
432
+ if conf[key] && conf[key].kind_of?(Array)
433
+ values = conf[key]
434
+ values.each do |value|
435
+ new_config = conf.clone
436
+ new_config[key] = value
437
+ configs.push new_config
438
+ end
439
+ else
440
+ configs.push conf
441
+ end
442
+
443
+ configs
444
+ end
445
+
446
+ def submit_spots(state)
447
+ configs = [config]
448
+ expanded = []
449
+ keys = [:instance_type, :subnet_id]
450
+
451
+ keys.each do |key|
452
+ configs.each do |conf|
453
+ expanded.push expand_config(conf, key)
454
+ end
455
+ configs = expanded.flatten
456
+ expanded = []
457
+ end
458
+
459
+ configs.each do |conf|
460
+ begin
461
+ @config = conf
462
+ return submit_spot(state)
463
+ rescue
464
+ end
465
+ end
466
+
467
+ raise "Could not create a spot"
468
+ end
469
+
425
470
  def submit_spot(state)
426
471
  debug("Creating EC2 Spot Instance..")
427
472
 
@@ -433,11 +478,11 @@ module Kitchen
433
478
  :spot_instance_request_fulfilled,
434
479
  spot_instance_request_ids: [spot_request_id]
435
480
  ) do |w|
436
- w.max_attempts = config[:retryable_tries]
481
+ w.max_attempts = config[:spot_wait] / config[:retryable_sleep]
437
482
  w.delay = config[:retryable_sleep]
438
483
  w.before_attempt do |attempts|
439
484
  c = attempts * config[:retryable_sleep]
440
- t = config[:retryable_tries] * config[:retryable_sleep]
485
+ t = config[:spot_wait]
441
486
  info "Waited #{c}/#{t}s for spot request <#{spot_request_id}> to become fulfilled."
442
487
  end
443
488
  end
@@ -445,9 +490,15 @@ module Kitchen
445
490
  end
446
491
 
447
492
  def create_spot_request
448
- request_duration = config[:retryable_tries] * config[:retryable_sleep]
493
+ request_duration = config[:spot_wait]
494
+ config_spot_price = config[:spot_price].to_s
495
+ if ["ondemand", "on-demand"].include?(config_spot_price)
496
+ spot_price = ""
497
+ else
498
+ spot_price = config_spot_price
499
+ end
449
500
  request_data = {
450
- spot_price: config[:spot_price].to_s,
501
+ spot_price: spot_price,
451
502
  launch_specification: instance_generator.ec2_instance_data,
452
503
  valid_until: Time.now + request_duration,
453
504
  }
@@ -593,6 +644,7 @@ module Kitchen
593
644
  "public" => "public_ip_address",
594
645
  "private" => "private_ip_address",
595
646
  "private_dns" => "private_dns_name",
647
+ "id" => "id",
596
648
  }.freeze
597
649
 
598
650
  #
@@ -22,6 +22,6 @@ module Kitchen
22
22
  module Driver
23
23
 
24
24
  # Version string for EC2 Test Kitchen driver
25
- EC2_VERSION = "3.0.1".freeze
25
+ EC2_VERSION = "3.1.0".freeze
26
26
  end
27
27
  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.0.1
4
+ version: 3.1.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: 2019-05-09 00:00:00.000000000 Z
11
+ date: 2019-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-kitchen