1# frozen_string_literal: true 2 3require 'rake_helper' 4 5RSpec.describe 'gitlab:pages', :silence_stdout do 6 before(:context) do 7 Rake.application.rake_require 'tasks/gitlab/pages' 8 end 9 10 describe 'migrate_legacy_storage task' do 11 subject { run_rake_task('gitlab:pages:migrate_legacy_storage') } 12 13 it 'calls migration service' do 14 expect_next_instance_of(::Pages::MigrateFromLegacyStorageService, anything, 15 ignore_invalid_entries: false, 16 mark_projects_as_not_deployed: false) do |service| 17 expect(service).to receive(:execute_with_threads).with(threads: 3, batch_size: 10).and_call_original 18 end 19 20 subject 21 end 22 23 it 'uses PAGES_MIGRATION_THREADS environment variable' do 24 stub_env('PAGES_MIGRATION_THREADS', '5') 25 26 expect_next_instance_of(::Pages::MigrateFromLegacyStorageService, anything, 27 ignore_invalid_entries: false, 28 mark_projects_as_not_deployed: false) do |service| 29 expect(service).to receive(:execute_with_threads).with(threads: 5, batch_size: 10).and_call_original 30 end 31 32 subject 33 end 34 35 it 'uses PAGES_MIGRATION_BATCH_SIZE environment variable' do 36 stub_env('PAGES_MIGRATION_BATCH_SIZE', '100') 37 38 expect_next_instance_of(::Pages::MigrateFromLegacyStorageService, anything, 39 ignore_invalid_entries: false, 40 mark_projects_as_not_deployed: false) do |service| 41 expect(service).to receive(:execute_with_threads).with(threads: 3, batch_size: 100).and_call_original 42 end 43 44 subject 45 end 46 47 it 'uses PAGES_MIGRATION_IGNORE_INVALID_ENTRIES environment variable' do 48 stub_env('PAGES_MIGRATION_IGNORE_INVALID_ENTRIES', 'true') 49 50 expect_next_instance_of(::Pages::MigrateFromLegacyStorageService, anything, 51 ignore_invalid_entries: true, 52 mark_projects_as_not_deployed: false) do |service| 53 expect(service).to receive(:execute_with_threads).with(threads: 3, batch_size: 10).and_call_original 54 end 55 56 subject 57 end 58 59 it 'uses PAGES_MIGRATION_MARK_PROJECTS_AS_NOT_DEPLOYED environment variable' do 60 stub_env('PAGES_MIGRATION_MARK_PROJECTS_AS_NOT_DEPLOYED', 'true') 61 62 expect_next_instance_of(::Pages::MigrateFromLegacyStorageService, anything, 63 ignore_invalid_entries: false, 64 mark_projects_as_not_deployed: true) do |service| 65 expect(service).to receive(:execute_with_threads).with(threads: 3, batch_size: 10).and_call_original 66 end 67 68 subject 69 end 70 end 71 72 describe 'clean_migrated_zip_storage task' do 73 it 'removes only migrated deployments' do 74 regular_deployment = create(:pages_deployment) 75 migrated_deployment = create(:pages_deployment, :migrated) 76 77 regular_deployment.project.update_pages_deployment!(regular_deployment) 78 migrated_deployment.project.update_pages_deployment!(migrated_deployment) 79 80 expect(PagesDeployment.all).to contain_exactly(regular_deployment, migrated_deployment) 81 82 run_rake_task('gitlab:pages:clean_migrated_zip_storage') 83 84 expect(PagesDeployment.all).to contain_exactly(regular_deployment) 85 expect(PagesDeployment.find_by_id(regular_deployment.id)).not_to be_nil 86 expect(PagesDeployment.find_by_id(migrated_deployment.id)).to be_nil 87 end 88 end 89 90 describe 'gitlab:pages:deployments:migrate_to_object_storage' do 91 subject { run_rake_task('gitlab:pages:deployments:migrate_to_object_storage') } 92 93 before do 94 stub_pages_object_storage(::Pages::DeploymentUploader, enabled: object_storage_enabled) 95 end 96 97 let!(:deployment) { create(:pages_deployment, file_store: store) } 98 let(:object_storage_enabled) { true } 99 100 context 'when local storage is used' do 101 let(:store) { ObjectStorage::Store::LOCAL } 102 103 context 'and remote storage is defined' do 104 it 'migrates file to remote storage' do 105 subject 106 107 expect(deployment.reload.file_store).to eq(ObjectStorage::Store::REMOTE) 108 end 109 end 110 111 context 'and remote storage is not defined' do 112 let(:object_storage_enabled) { false } 113 114 it 'fails to migrate to remote storage' do 115 subject 116 117 expect(deployment.reload.file_store).to eq(ObjectStorage::Store::LOCAL) 118 end 119 end 120 end 121 122 context 'when remote storage is used' do 123 let(:store) { ObjectStorage::Store::REMOTE } 124 125 it 'file stays on remote storage' do 126 subject 127 128 expect(deployment.reload.file_store).to eq(ObjectStorage::Store::REMOTE) 129 end 130 end 131 end 132 133 describe 'gitlab:pages:deployments:migrate_to_local' do 134 subject { run_rake_task('gitlab:pages:deployments:migrate_to_local') } 135 136 before do 137 stub_pages_object_storage(::Pages::DeploymentUploader, enabled: object_storage_enabled) 138 end 139 140 let!(:deployment) { create(:pages_deployment, file_store: store) } 141 let(:object_storage_enabled) { true } 142 143 context 'when remote storage is used' do 144 let(:store) { ObjectStorage::Store::REMOTE } 145 146 context 'and job has remote file store defined' do 147 it 'migrates file to local storage' do 148 subject 149 150 expect(deployment.reload.file_store).to eq(ObjectStorage::Store::LOCAL) 151 end 152 end 153 end 154 155 context 'when local storage is used' do 156 let(:store) { ObjectStorage::Store::LOCAL } 157 158 it 'file stays on local storage' do 159 subject 160 161 expect(deployment.reload.file_store).to eq(ObjectStorage::Store::LOCAL) 162 end 163 end 164 end 165end 166