summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKrasimir Angelov <kangelov@gitlab.com>2019-08-16 13:27:20 +0300
committerKrasimir Angelov <kangelov@gitlab.com>2019-09-03 15:39:33 +1200
commitb78e5ebd06a3d68798f460b601b01d01f067b281 (patch)
tree1081fcb35c7ec8d4524d0e213ec12fca709ba1cb
parentf341efa5fb2ff03e8c18aed0f590af8f88bffcb3 (diff)
downloadgitlab-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.rb10
-rw-r--r--lib/api/internal/pages.rb5
-rw-r--r--spec/models/pages_domain_spec.rb28
-rw-r--r--spec/requests/api/internal/pages_spec.rb46
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")