summaryrefslogtreecommitdiff
path: root/app/services/pod_logs/base_service.rb
blob: 8936f9b67a5dd8f088e8bca473bdcbeb438ed95a (plain)
1
2
3
4
5
6
7
8
9
10
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# frozen_string_literal: true

module PodLogs
  class BaseService < ::BaseService
    include ReactiveCaching
    include Stepable

    attr_reader :cluster, :namespace, :params

    CACHE_KEY_GET_POD_LOG = 'get_pod_log'
    K8S_NAME_MAX_LENGTH = 253

    def id
      cluster.id
    end

    def initialize(cluster, namespace, params: {})
      @cluster = cluster
      @namespace = namespace
      @params = filter_params(params.dup.stringify_keys).to_hash
    end

    def execute
      with_reactive_cache(
        CACHE_KEY_GET_POD_LOG,
        namespace,
        params
      ) do |result|
        result
      end
    end

    def calculate_reactive_cache(request, _namespace, _params)
      case request
      when CACHE_KEY_GET_POD_LOG
        execute_steps
      else
        exception = StandardError.new('Unknown reactive cache request')
        Gitlab::ErrorTracking.track_and_raise_for_dev_exception(exception, request: request)
        error(_('Unknown cache key'))
      end
    end

    private

    def valid_params
      %w(pod_name container_name)
    end

    def success_return_keys
      %i(status logs pod_name container_name pods)
    end

    def check_arguments(result)
      return error(_('Cluster does not exist')) if cluster.nil?
      return error(_('Namespace is empty')) if namespace.blank?

      result[:pod_name] = params['pod_name'].presence
      result[:container_name] = params['container_name'].presence

      return error(_('Invalid pod_name')) if result[:pod_name] && !result[:pod_name].is_a?(String)
      return error(_('Invalid container_name')) if result[:container_name] && !result[:container_name].is_a?(String)

      success(result)
    end

    def get_raw_pods(result)
      raise NotImplementedError
    end

    def get_pod_names(result)
      result[:pods] = result[:raw_pods].map { |p| p[:name] }

      success(result)
    end

    def pod_logs(result)
      raise NotImplementedError
    end

    def filter_return_keys(result)
      result.slice(*success_return_keys)
    end

    def filter_params(params)
      params.slice(*valid_params)
    end
  end
end