BigW Consortium Gitlab

migrate_old_artifacts_spec.rb 3.87 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12
# encoding: utf-8

require 'spec_helper'
require Rails.root.join('db', 'post_migrate', '20170523083112_migrate_old_artifacts.rb')

describe MigrateOldArtifacts do
  let(:migration) { described_class.new }
  let!(:directory) { Dir.mktmpdir }

  before do
    allow(Gitlab.config.artifacts).to receive(:path).and_return(directory)
  end
13

14 15 16 17 18
  after do
    FileUtils.remove_entry_secure(directory)
  end

  context 'with migratable data' do
19 20 21
    set(:project1) { create(:project, ci_id: 2) }
    set(:project2) { create(:project, ci_id: 3) }
    set(:project3) { create(:project) }
22

23 24 25
    set(:pipeline1) { create(:ci_empty_pipeline, project: project1) }
    set(:pipeline2) { create(:ci_empty_pipeline, project: project2) }
    set(:pipeline3) { create(:ci_empty_pipeline, project: project3) }
26 27 28

    let!(:build_with_legacy_artifacts) { create(:ci_build, pipeline: pipeline1) }
    let!(:build_without_artifacts) { create(:ci_build, pipeline: pipeline1) }
29 30
    let!(:build2) { create(:ci_build, pipeline: pipeline2) }
    let!(:build3) { create(:ci_build, pipeline: pipeline3) }
31 32

    before do
33 34
      setup_builds(build2, build3)

35 36 37 38 39 40 41 42
      store_artifacts_in_legacy_path(build_with_legacy_artifacts)
    end

    it "legacy artifacts are not accessible" do
      expect(build_with_legacy_artifacts.artifacts?).to be_falsey
    end

    it "legacy artifacts are set" do
43
      expect(build_with_legacy_artifacts.legacy_artifacts_file_identifier).not_to be_nil
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 90 91 92 93 94 95 96 97
    end

    describe '#min_id' do
      subject { migration.send(:min_id) }

      it 'returns the newest build for which ci_id is not defined' do
        is_expected.to eq(build3.id)
      end
    end

    describe '#builds_with_artifacts' do
      subject { migration.send(:builds_with_artifacts).map(&:id) }

      it 'returns a list of builds that has artifacts and could be migrated' do
        is_expected.to contain_exactly(build_with_legacy_artifacts.id, build2.id)
      end
    end

    describe '#up' do
      context 'when migrating artifacts' do
        before do
          migration.up
        end

        it 'all files do have artifacts' do
          Ci::Build.with_artifacts do |build|
            expect(build).to have_artifacts
          end
        end

        it 'artifacts are no longer present on legacy path' do
          expect(File.exist?(legacy_path(build_with_legacy_artifacts))).to eq(false)
        end
      end

      context 'when there are aritfacts in old and new directory' do
        before do
          store_artifacts_in_legacy_path(build2)

          migration.up
        end

        it 'does not move old files' do
          expect(File.exist?(legacy_path(build2))).to eq(true)
        end
      end
    end

    private

    def store_artifacts_in_legacy_path(build)
      FileUtils.mkdir_p(legacy_path(build))

      FileUtils.copy(
Kamil Trzcinski committed
98 99
        Rails.root.join('spec/fixtures/ci_build_artifacts.zip'),
        File.join(legacy_path(build), "ci_build_artifacts.zip"))
100

101
      FileUtils.copy(
Kamil Trzcinski committed
102 103 104
        Rails.root.join('spec/fixtures/ci_build_artifacts_metadata.gz'),
        File.join(legacy_path(build), "ci_build_artifacts_metadata.gz"))

105 106
      build.update_columns(
        artifacts_file: 'ci_build_artifacts.zip',
Kamil Trzcinski committed
107 108
        artifacts_metadata: 'ci_build_artifacts_metadata.gz')

109 110 111 112 113 114 115 116 117
      build.reload
    end

    def legacy_path(build)
      File.join(directory,
        build.created_at.utc.strftime('%Y_%m'),
        build.project.ci_id.to_s,
        build.id.to_s)
    end
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136

    def new_legacy_path(build)
      File.join(directory,
                build.created_at.utc.strftime('%Y_%m'),
                build.project_id.to_s,
                build.id.to_s)
    end

    def setup_builds(*builds)
      builds.each do |build|
        FileUtils.mkdir_p(new_legacy_path(build))

        build.update_columns(
          artifacts_file: 'ci_build_artifacts.zip',
          artifacts_metadata: 'ci_build_artifacts_metadata.gz')

        build.reload
      end
    end
137 138
  end
end