diff options
author | Krasimir Angelov <kangelov@gitlab.com> | 2019-08-16 13:27:20 +0300 |
---|---|---|
committer | Krasimir Angelov <kangelov@gitlab.com> | 2019-09-03 15:39:33 +1200 |
commit | b78e5ebd06a3d68798f460b601b01d01f067b281 (patch) | |
tree | 1081fcb35c7ec8d4524d0e213ec12fca709ba1cb | |
parent | f341efa5fb2ff03e8c18aed0f590af8f88bffcb3 (diff) | |
download | gitlab-ce-b78e5ebd06a3d68798f460b601b01d01f067b281.tar.gz |
Migrate project pages metadata when asked for virtual domain
Create project_pages_metadatum on the fly when asked for
PagesDomain#pages_virtual_domain.
Update the internal Pages API to return 204 No Content for custom
domains that do not have pages deployed yet.
-rw-r--r-- | app/models/pages_domain.rb | 10 | ||||
-rw-r--r-- | lib/api/internal/pages.rb | 5 | ||||
-rw-r--r-- | spec/models/pages_domain_spec.rb | 28 | ||||
-rw-r--r-- | spec/requests/api/internal/pages_spec.rb | 46 |
4 files changed, 71 insertions, 18 deletions
diff --git a/app/models/pages_domain.rb b/app/models/pages_domain.rb index 142967f886d..2ee3a2a1ae3 100644 --- a/app/models/pages_domain.rb +++ b/app/models/pages_domain.rb @@ -186,11 +186,21 @@ class PagesDomain < ApplicationRecord end def pages_virtual_domain + return unless pages_deployed? + Pages::VirtualDomain.new([project], domain: self) end private + def pages_deployed? + return true if project.project_pages_metadatum&.deployed? + + Project.where(id: project_id).migrate_project_pages_metadata + + project.reset.project_pages_metadatum&.deployed? + end + def set_verification_code return if self.verification_code.present? diff --git a/lib/api/internal/pages.rb b/lib/api/internal/pages.rb index 6b6ccce0275..2ba6b65f0c5 100644 --- a/lib/api/internal/pages.rb +++ b/lib/api/internal/pages.rb @@ -27,7 +27,10 @@ module API host = Namespace.find_by_pages_host(params[:host]) || PagesDomain.find_by_domain(params[:host]) not_found! unless host - present host.pages_virtual_domain, with: Entities::Internal::Pages::VirtualDomain + virtual_domain = host.pages_virtual_domain + no_content! unless virtual_domain + + present virtual_domain, with: Entities::Internal::Pages::VirtualDomain end end end diff --git a/spec/models/pages_domain_spec.rb b/spec/models/pages_domain_spec.rb index 519c519fbcf..8237f926ed3 100644 --- a/spec/models/pages_domain_spec.rb +++ b/spec/models/pages_domain_spec.rb @@ -538,4 +538,32 @@ describe PagesDomain do ) end end + + describe '#pages_virtual_domain' do + let(:project) { create(:project) } + let(:pages_domain) { create(:pages_domain, project: project) } + + context 'when there are no pages deployed for the project' do + it 'returns nil when there are no pages deployed for the project' do + expect(pages_domain.pages_virtual_domain).to be_nil + end + end + + context 'when there are pages deployed for the project' do + before do + generic_commit_status = create(:generic_commit_status, :success, stage: 'deploy', name: 'pages:deploy') + generic_commit_status.update!(project: project) + end + + it 'returns the virual domain' do + expect(pages_domain.pages_virtual_domain).to be_an_instance_of(Pages::VirtualDomain) + end + + it 'migrates project pages metadata' do + expect { pages_domain.pages_virtual_domain }.to change { + project.project_pages_metadatum&.deployed + }.from(nil).to(true) + end + end + end end diff --git a/spec/requests/api/internal/pages_spec.rb b/spec/requests/api/internal/pages_spec.rb index 4efa4276be7..c6abe9a1088 100644 --- a/spec/requests/api/internal/pages_spec.rb +++ b/spec/requests/api/internal/pages_spec.rb @@ -43,6 +43,11 @@ describe API::Internal::Pages do super(host, headers) end + def deploy_pages(project) + generic_commit_status = create(:generic_commit_status, :success, stage: 'deploy', name: 'pages:deploy') + generic_commit_status.update!(project: project) + end + context 'not existing host' do it 'responds with 404 Not Found' do query_host('pages.gitlab.io') @@ -52,33 +57,40 @@ describe API::Internal::Pages do end context 'custom domain' do - it 'responds with the correct domain configuration' do - namespace = create(:namespace, name: 'gitlab-org') - project = create(:project, namespace: namespace, name: 'gitlab-ce') - pages_domain = create(:pages_domain, domain: 'pages.gitlab.io', project: project) + let(:namespace) { create(:namespace, name: 'gitlab-org') } + let(:project) { create(:project, namespace: namespace, name: 'gitlab-ce') } + let!(:pages_domain) { create(:pages_domain, domain: 'pages.gitlab.io', project: project) } - query_host('pages.gitlab.io') + context 'when there are no pages deployed for the related project' do + it 'responds with 204 No Content' do + query_host('pages.gitlab.io') - expect(response).to have_gitlab_http_status(200) - expect(response).to match_response_schema('internal/pages/virtual_domain') + expect(response).to have_gitlab_http_status(204) + end + end - expect(json_response['certificate']).to eq(pages_domain.certificate) - expect(json_response['key']).to eq(pages_domain.key) + context 'when there are pages deployed for the related project' do + it 'responds with the correct domain configuration' do + deploy_pages(project) - lookup_path = json_response['lookup_paths'][0] - expect(lookup_path['prefix']).to eq('/') - expect(lookup_path['source']['path']).to eq('gitlab-org/gitlab-ce/public/') + query_host('pages.gitlab.io') + + expect(response).to have_gitlab_http_status(200) + expect(response).to match_response_schema('internal/pages/virtual_domain') + + expect(json_response['certificate']).to eq(pages_domain.certificate) + expect(json_response['key']).to eq(pages_domain.key) + + lookup_path = json_response['lookup_paths'][0] + expect(lookup_path['prefix']).to eq('/') + expect(lookup_path['source']['path']).to eq('gitlab-org/gitlab-ce/public/') + end end end context 'namespaced domain' do let(:group) { create(:group, name: 'mygroup') } - def deploy_pages(project) - generic_commit_status = create(:generic_commit_status, :success, stage: 'deploy', name: 'pages:deploy') - generic_commit_status.update!(project: project) - end - before do allow(Settings.pages).to receive(:host).and_return('gitlab-pages.io') allow(Gitlab.config.pages).to receive(:url).and_return("http://gitlab-pages.io") |