Welcome to mirror list, hosted at ThFree Co, Russian Federation.

migration_helper.rb « uploads « gitlab « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: b610d2a10c67ecc41c6a6ba91d9446d45a8b4a57 (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
# frozen_string_literal: true

module Gitlab
  module Uploads
    class MigrationHelper
      attr_reader :logger

      CATEGORIES = [%w(AvatarUploader Project :avatar),
                    %w(AvatarUploader Group :avatar),
                    %w(AvatarUploader User :avatar),
                    %w(AttachmentUploader Note :attachment),
                    %w(AttachmentUploader Appearance :logo),
                    %w(AttachmentUploader Appearance :header_logo),
                    %w(FaviconUploader Appearance :favicon),
                    %w(FileUploader Project),
                    %w(PersonalFileUploader Snippet),
                    %w(NamespaceFileUploader Snippet),
                    %w(DesignManagement::DesignV432x230Uploader DesignManagement::Action :image_v432x230),
                    %w(FileUploader MergeRequest)].freeze

      def initialize(args, logger)
        prepare_variables(args, logger)
      end

      def self.categories
        CATEGORIES
      end

      def migrate_to_remote_storage
        @to_store = ObjectStorage::Store::REMOTE

        uploads.each_batch(of: batch_size, &method(:enqueue_batch))
      end

      def migrate_to_local_storage
        @to_store = ObjectStorage::Store::LOCAL

        uploads(ObjectStorage::Store::REMOTE).each_batch(of: batch_size, &method(:enqueue_batch))
      end

      private

      def batch_size
        ENV.fetch('MIGRATION_BATCH_SIZE', 200).to_i
      end

      def prepare_variables(args, logger)
        @mounted_as     = args.mounted_as&.gsub(':', '')&.to_sym
        @uploader_class = args.uploader_class.constantize
        @model_class    = args.model_class.constantize
        @logger         = logger
      end

      def enqueue_batch(batch, index)
        job = ObjectStorage::MigrateUploadsWorker.enqueue!(batch,
                                                           @model_class,
                                                           @mounted_as,
                                                           @to_store)
        logger.info(message: "[Uploads migration] Enqueued upload migration job", index: index, job_id: job)
      rescue ObjectStorage::MigrateUploadsWorker::SanityCheckError => e
        # continue for the next batch
        logger.warn(message: "[Uploads migration] Could not enqueue batch", ids: batch.ids, reason: e.message) # rubocop:disable CodeReuse/ActiveRecord
      end

      # rubocop:disable CodeReuse/ActiveRecord
      def uploads(store_type = [nil, ObjectStorage::Store::LOCAL])
        Upload.class_eval { include EachBatch } unless Upload < EachBatch

        Upload
          .where(store: store_type,
                 uploader: @uploader_class.to_s,
                 model_type: @model_class.base_class.sti_name)
      end
      # rubocop:enable CodeReuse/ActiveRecord
    end
  end
end

Gitlab::Uploads::MigrationHelper.prepend_if_ee('EE::Gitlab::Uploads::MigrationHelper')