summaryrefslogtreecommitdiff
path: root/lib/gitlab/background_migration/backfill_jira_tracker_deployment_type2.rb
blob: 669e5338dd1c2de1ffbd768a549fbe8ea9a6be68 (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
# frozen_string_literal: true

# Based on https://community.developer.atlassian.com/t/get-rest-api-3-filter-search/29459/2,
# it's enough at the moment to simply notice if the url is from `atlassian.net`
module Gitlab
  module BackgroundMigration
    # Backfill the deployment_type in jira_tracker_data table
    class BackfillJiraTrackerDeploymentType2
      # Migration only version of jira_tracker_data table
      class JiraTrackerDataTemp < ApplicationRecord
        self.table_name = 'jira_tracker_data'

        def self.encryption_options
          {
            key: Settings.attr_encrypted_db_key_base_32,
            encode: true,
            mode: :per_attribute_iv,
            algorithm: 'aes-256-gcm'
          }
        end

        attr_encrypted :url, encryption_options
        attr_encrypted :api_url, encryption_options

        enum deployment_type: { unknown: 0, server: 1, cloud: 2 }, _prefix: :deployment
      end

      # Migration only version of services table
      class JiraServiceTemp < ApplicationRecord
        self.table_name = 'services'
        self.inheritance_column = :_type_disabled
      end

      def perform(start_id, stop_id)
        @server_ids = []
        @cloud_ids  = []

        JiraTrackerDataTemp
          .where(id: start_id..stop_id, deployment_type: 0)
          .each do |jira_tracker_data|
            collect_deployment_type(jira_tracker_data)
          end

        unless cloud_ids.empty?
          JiraTrackerDataTemp.where(id: cloud_ids)
            .update_all(deployment_type: JiraTrackerDataTemp.deployment_types[:cloud])
        end

        unless server_ids.empty?
          JiraTrackerDataTemp.where(id: server_ids)
            .update_all(deployment_type: JiraTrackerDataTemp.deployment_types[:server])
        end

        mark_jobs_as_succeeded(start_id, stop_id)
      end

      private

      attr_reader :server_ids, :cloud_ids

      def client_url(jira_tracker_data)
        jira_tracker_data.api_url.presence || jira_tracker_data.url.presence
      end

      def server_type(url)
        url.downcase.include?('.atlassian.net') ? :cloud : :server
      end

      def collect_deployment_type(jira_tracker_data)
        url = client_url(jira_tracker_data)
        return unless url

        case server_type(url)
        when :cloud
          cloud_ids << jira_tracker_data.id
        else
          server_ids << jira_tracker_data.id
        end
      end

      def mark_jobs_as_succeeded(*arguments)
        Gitlab::Database::BackgroundMigrationJob.mark_all_as_succeeded(self.class.name.demodulize, arguments)
      end
    end
  end
end