BigW Consortium Gitlab

namespace_check.rb 1.5 KB
Newer Older
1 2 3 4 5 6
module SystemCheck
  module Orphans
    class NamespaceCheck < SystemCheck::BaseCheck
      set_name 'Orphaned namespaces:'

      def multi_check
7
        Gitlab.config.repositories.storages.each do |storage_name, repository_storage|
8
          $stdout.puts
9 10
          $stdout.puts "* Storage: #{storage_name} (#{repository_storage['path']})".color(:yellow)
          toplevel_namespace_dirs = disk_namespaces(repository_storage['path'])
11 12

          orphans = (toplevel_namespace_dirs - existing_namespaces)
13
          print_orphans(orphans, storage_name)
14 15 16 17 18 19 20
        end

        clear_namespaces! # releases memory when check finishes
      end

      private

21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
      def print_orphans(orphans, storage_name)
        if orphans.empty?
          $stdout.puts "* No orphaned namespaces for #{storage_name} storage".color(:green)
          return
        end

        orphans.each do |orphan|
          $stdout.puts " - #{orphan}".color(:red)
        end
      end

      def disk_namespaces(storage_path)
        fetch_disk_namespaces(storage_path).each_with_object([]) do |namespace_path, result|
          namespace = File.basename(namespace_path)
          next if namespace.eql?('@hashed')

          result << namespace
        end
      end

      def fetch_disk_namespaces(storage_path)
        Dir.glob(File.join(storage_path, '*'))
      end

45
      def existing_namespaces
46
        @namespaces ||= Namespace.where(parent: nil).all.pluck(:path)
47 48 49 50 51 52 53 54
      end

      def clear_namespaces!
        @namespaces = nil
      end
    end
  end
end