1# frozen_string_literal: true
2
3module Ci
4  module ResourceGroups
5    class AssignResourceFromResourceGroupService < ::BaseService
6      # rubocop: disable CodeReuse/ActiveRecord
7      def execute(resource_group)
8        release_resource_from_stale_jobs(resource_group)
9
10        free_resources = resource_group.resources.free.count
11
12        resource_group.upcoming_processables.take(free_resources).each do |processable|
13          processable.enqueue_waiting_for_resource
14        end
15      end
16      # rubocop: enable CodeReuse/ActiveRecord
17
18      private
19
20      def release_resource_from_stale_jobs(resource_group)
21        resource_group.resources.stale_processables.find_each do |processable|
22          resource_group.release_resource_from(processable)
23        end
24      end
25    end
26  end
27end
28