Class: KnapsackPro::Allocator

Inherits:
Object
  • Object
show all
Defined in:
lib/knapsack_pro/allocator.rb

Instance Method Summary collapse

Constructor Details

#initialize(args) ⇒ Allocator

Returns a new instance of Allocator.



3
4
5
6
7
8
9
# File 'lib/knapsack_pro/allocator.rb', line 3

def initialize(args)
  @fast_and_slow_test_files_to_run = args.fetch(:fast_and_slow_test_files_to_run)
  @fallback_mode_test_files = args.fetch(:fallback_mode_test_files)
  @ci_node_total = args.fetch(:ci_node_total)
  @ci_node_index = args.fetch(:ci_node_index)
  @repository_adapter = args.fetch(:repository_adapter)
end

Instance Method Details

#test_file_pathsObject



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/knapsack_pro/allocator.rb', line 11

def test_file_paths
  action = build_action(cache_read_attempt: true)
  connection = KnapsackPro::Client::Connection.new(action)
  response = connection.call

  # when a cache miss because the test suite split was not cached yet
  if connection.success? && connection.api_code == KnapsackPro::Client::API::V1::BuildDistributions::TEST_SUITE_SPLIT_CACHE_MISS_CODE
    # make an attempt to initalize a new test suite split on the API side
    action = build_action(cache_read_attempt: false)
    connection = KnapsackPro::Client::Connection.new(action)
    response = connection.call
  end

  if connection.success?
    raise ArgumentError.new(response) if connection.errors?
    prepare_test_files(response)
  elsif !KnapsackPro::Config::Env.fallback_mode_enabled?
    message = 'Fallback Mode was disabled with KNAPSACK_PRO_FALLBACK_MODE_ENABLED=false. Please restart this CI node to retry tests. Most likely Fallback Mode was disabled due to https://github.com/KnapsackPro/knapsack_pro-ruby#required-ci-configuration-if-you-use-retry-single-failed-ci-node-feature-on-your-ci-server-when-knapsack_pro_fixed_queue_splittrue-in-queue-mode-or-knapsack_pro_fixed_test_suite_splittrue-in-regular-mode'
    KnapsackPro.logger.error(message)
    raise message
  elsif KnapsackPro::Config::Env.ci_node_retry_count > 0
    message = 'knapsack_pro gem could not connect to Knapsack Pro API and the Fallback Mode cannot be used this time. Running tests in Fallback Mode are not allowed for retried parallel CI node to avoid running the wrong set of tests. Please manually retry this parallel job on your CI server then knapsack_pro gem will try to connect to Knapsack Pro API again and will run a correct set of tests for this CI node. Learn more https://github.com/KnapsackPro/knapsack_pro-ruby#required-ci-configuration-if-you-use-retry-single-failed-ci-node-feature-on-your-ci-server-when-knapsack_pro_fixed_queue_splittrue-in-queue-mode-or-knapsack_pro_fixed_test_suite_splittrue-in-regular-mode'
    unless KnapsackPro::Config::Env.fixed_test_suite_split?
      message += ' Please ensure you have set KNAPSACK_PRO_FIXED_TEST_SUITE_SPLIT=true to allow Knapsack Pro API remember the recorded CI node tests so when you retry failed tests on the CI node then the same set of tests will be executed. See more https://github.com/KnapsackPro/knapsack_pro-ruby#knapsack_pro_fixed_test_suite_split-test-suite-split-based-on-seed'
    end
    KnapsackPro.logger.error(message)
    raise message
  else
    KnapsackPro.logger.warn("Fallback mode started. We could not connect with Knapsack Pro API. Your tests will be executed based on directory names. Read more about fallback mode at https://knapsackpro.com/faq/question/what-happens-when-knapsack-pro-api-is-not-availablenot-reachable-temporarily")
    fallback_test_files
  end
end