diff options
Diffstat (limited to 'app/services/clusters/agents/filter_authorizations_service.rb')
-rw-r--r-- | app/services/clusters/agents/filter_authorizations_service.rb | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/app/services/clusters/agents/filter_authorizations_service.rb b/app/services/clusters/agents/filter_authorizations_service.rb new file mode 100644 index 00000000000..68517ceec04 --- /dev/null +++ b/app/services/clusters/agents/filter_authorizations_service.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +module Clusters + module Agents + class FilterAuthorizationsService + def initialize(authorizations, filter_params) + @authorizations = authorizations + @filter_params = filter_params + + @environments_matcher = {} + end + + def execute + filter_by_environment(authorizations) + end + + private + + attr_reader :authorizations, :filter_params + + def filter_by_environment(auths) + return auths unless filter_by_environment? + + auths.select do |auth| + next true if auth.config['environments'].blank? + + auth.config['environments'].any? { |environment_pattern| matches_environment?(environment_pattern) } + end + end + + def filter_by_environment? + filter_params.has_key?(:environment) + end + + def environment_filter + @environment_filter ||= filter_params[:environment] + end + + def matches_environment?(environment_pattern) + return false if environment_filter.nil? + + environments_matcher(environment_pattern).match?(environment_filter) + end + + def environments_matcher(environment_pattern) + @environments_matcher[environment_pattern] ||= ::Gitlab::Ci::EnvironmentMatcher.new(environment_pattern) + end + end + end +end |