diff options
21 files changed, 242 insertions, 47 deletions
diff --git a/.gitlab/issue_templates/Feature proposal.md b/.gitlab/issue_templates/Feature proposal.md index dea2384a2e9..fa989e45281 100644 --- a/.gitlab/issue_templates/Feature proposal.md +++ b/.gitlab/issue_templates/Feature proposal.md @@ -38,7 +38,9 @@ If this feature requires changing permissions, this document https://docs.gitlab ### Availability & Testing -<!-- What risks does this change pose to our availability? How might it affect the quality of the product? What additional test coverage or changes to tests will be needed? Will it require cross-browser testing? +<!-- This section needs to be retained and filled in during the workflow planning breakdown phase of this feature proposal, if not earlier. + + What risks does this change pose to our availability? How might it affect the quality of the product? What additional test coverage or changes to tests will be needed? Will it require cross-browser testing? Please list the test areas (unit, integration and end-to-end) that needs to be added or updated to ensure that this feature will work as intended. Please use the list below as guidance. * Unit test changes @@ -51,7 +53,7 @@ See the test engineering planning process and reach out to your counterpart Soft <!-- Define both the success metrics and acceptance criteria. Note that success metrics indicate the desired business outcomes, while acceptance criteria indicate when the solution is working correctly. If there is no way to measure success, link to an issue that will implement a way to measure this. --> -### What is the type of buyer? +### What is the type of buyer? <!-- Which leads to: in which enterprise tier should this feature go? See https://about.gitlab.com/handbook/product/pricing/#four-tiers --> diff --git a/CHANGELOG-EE.md b/CHANGELOG-EE.md index ab7d706fc7b..3e09b0ef702 100644 --- a/CHANGELOG-EE.md +++ b/CHANGELOG-EE.md @@ -1,5 +1,12 @@ Please view this file on the master branch, on stable branches it's out of date. +## 12.7.5 + +### Fixed (1 change) + +- Fix DB connection pool size for Geo database. !24021 + + ## 12.7.3 - No changes. diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ce912798ee..eb5031d79cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,13 @@ entry. ## 12.7.5 -- No changes. +### Fixed (4 changes, 1 of them is from the community) + +- Add accidentally deleted project config for custom apply suggestions. !23687 (Fabio Huser) +- Fix database permission check for triggers on Amazon RDS. !24035 +- Fix applying the suggestions with an empty custom message. !24144 +- Remove invalid data from issue_tracker_data table. + ## 12.7.3 diff --git a/app/models/pages_domain.rb b/app/models/pages_domain.rb index dd2cafd9a35..330764ebc7f 100644 --- a/app/models/pages_domain.rb +++ b/app/models/pages_domain.rb @@ -6,7 +6,8 @@ class PagesDomain < ApplicationRecord SSL_RENEWAL_THRESHOLD = 30.days.freeze enum certificate_source: { user_provided: 0, gitlab_provided: 1 }, _prefix: :certificate - enum domain_type: { instance: 0, group: 1, project: 2 }, _prefix: :domain_type + enum scope: { instance: 0, group: 1, project: 2 }, _prefix: :scope + enum usage: { pages: 0, serverless: 1 }, _prefix: :usage belongs_to :project has_many :acme_orders, class_name: "PagesDomainAcmeOrder" @@ -26,8 +27,9 @@ class PagesDomain < ApplicationRecord validate :validate_intermediates, if: ->(domain) { domain.certificate.present? && domain.certificate_changed? } default_value_for(:auto_ssl_enabled, allow_nil: false) { ::Gitlab::LetsEncrypt.enabled? } - default_value_for :domain_type, allow_nil: false, value: :project + default_value_for :scope, allow_nil: false, value: :project default_value_for :wildcard, allow_nil: false, value: false + default_value_for :usage, allow_nil: false, value: :pages attr_encrypted :key, mode: :per_attribute_iv_and_salt, @@ -220,7 +222,7 @@ class PagesDomain < ApplicationRecord # rubocop: disable CodeReuse/ServiceClass def update_daemon - return if domain_type_instance? + return if usage_serverless? ::Projects::UpdatePagesConfigurationService.new(project).execute end diff --git a/app/models/release.rb b/app/models/release.rb index ecfae554fe0..2543717895f 100644 --- a/app/models/release.rb +++ b/app/models/release.rb @@ -34,7 +34,6 @@ class Release < ApplicationRecord delegate :repository, to: :project - after_commit :create_evidence!, on: :create, unless: :importing? after_commit :notify_new_release, on: :create, unless: :importing? MAX_NUMBER_TO_DISPLAY = 3 @@ -70,6 +69,10 @@ class Release < ApplicationRecord released_at.present? && released_at > Time.zone.now end + def historical_release? + released_at.present? && released_at < created_at + end + def name self.read_attribute(:name) || tag end @@ -98,10 +101,6 @@ class Release < ApplicationRecord end end - def create_evidence! - CreateEvidenceWorker.perform_async(self.id) - end - def notify_new_release NewReleaseWorker.perform_async(id) end diff --git a/changelogs/unreleased/198938-fix-invalid-issue-tracker-data.yml b/changelogs/unreleased/198938-fix-invalid-issue-tracker-data.yml deleted file mode 100644 index 36bf6e3aa26..00000000000 --- a/changelogs/unreleased/198938-fix-invalid-issue-tracker-data.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Remove invalid data from issue_tracker_data table -merge_request: -author: -type: fixed diff --git a/changelogs/unreleased/38103-collect-release-evidence-at-moment-of-release-end-date.yml b/changelogs/unreleased/38103-collect-release-evidence-at-moment-of-release-end-date.yml new file mode 100644 index 00000000000..97a5807ab17 --- /dev/null +++ b/changelogs/unreleased/38103-collect-release-evidence-at-moment-of-release-end-date.yml @@ -0,0 +1,5 @@ +--- +title: Collect release evidence at release timestamp +merge_request: 23697 +author: +type: added diff --git a/changelogs/unreleased/ali-add-type-to-pages-domains.yml b/changelogs/unreleased/ali-add-type-to-pages-domains.yml new file mode 100644 index 00000000000..60c60f7179d --- /dev/null +++ b/changelogs/unreleased/ali-add-type-to-pages-domains.yml @@ -0,0 +1,5 @@ +--- +title: Update PagesDomains data model for serverless domains +merge_request: 23943 +author: +type: changed diff --git a/changelogs/unreleased/fix-missing-apply-sugegstion-project-setting.yml b/changelogs/unreleased/fix-missing-apply-sugegstion-project-setting.yml deleted file mode 100644 index d084148fbd8..00000000000 --- a/changelogs/unreleased/fix-missing-apply-sugegstion-project-setting.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Add accidentally deleted project config for custom apply suggestions -merge_request: 23687 -author: Fabio Huser -type: fixed diff --git a/changelogs/unreleased/id-fix-suggestions.yml b/changelogs/unreleased/id-fix-suggestions.yml deleted file mode 100644 index 3987a590e14..00000000000 --- a/changelogs/unreleased/id-fix-suggestions.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix applying the suggestions with an empty custom message -merge_request: 24144 -author: -type: fixed diff --git a/changelogs/unreleased/sh-fix-trigger-check-rds.yml b/changelogs/unreleased/sh-fix-trigger-check-rds.yml deleted file mode 100644 index 99ae6039aaa..00000000000 --- a/changelogs/unreleased/sh-fix-trigger-check-rds.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Fix database permission check for triggers on Amazon RDS -merge_request: 24035 -author: -type: fixed diff --git a/db/migrate/20200128184209_add_usage_to_pages_domains.rb b/db/migrate/20200128184209_add_usage_to_pages_domains.rb new file mode 100644 index 00000000000..292490078cd --- /dev/null +++ b/db/migrate/20200128184209_add_usage_to_pages_domains.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +class AddUsageToPagesDomains < ActiveRecord::Migration[5.2] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + PAGES_USAGE = 0 + + disable_ddl_transaction! + + def up + add_column_with_default :pages_domains, :usage, :integer, limit: 2, default: PAGES_USAGE, allow_null: false # rubocop:disable Migration/AddColumnWithDefault + end + + def down + remove_column :pages_domains, :usage + end +end diff --git a/db/migrate/20200129034515_update_indexes_of_pages_domains_add_usage_domain_wildcard_remove_domain.rb b/db/migrate/20200129034515_update_indexes_of_pages_domains_add_usage_domain_wildcard_remove_domain.rb new file mode 100644 index 00000000000..2f13567c540 --- /dev/null +++ b/db/migrate/20200129034515_update_indexes_of_pages_domains_add_usage_domain_wildcard_remove_domain.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class UpdateIndexesOfPagesDomainsAddUsageDomainWildcardRemoveDomain < ActiveRecord::Migration[5.2] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + add_concurrent_index :pages_domains, :usage + add_concurrent_index :pages_domains, [:domain, :wildcard], unique: true + remove_concurrent_index :pages_domains, :domain + end + + def down + remove_concurrent_index :pages_domains, :usage + remove_concurrent_index :pages_domains, [:domain, :wildcard] + add_concurrent_index :pages_domains, :domain, unique: true + end +end diff --git a/db/migrate/20200129035446_rename_pages_domains_domain_type_to_scope.rb b/db/migrate/20200129035446_rename_pages_domains_domain_type_to_scope.rb new file mode 100644 index 00000000000..74d9827e370 --- /dev/null +++ b/db/migrate/20200129035446_rename_pages_domains_domain_type_to_scope.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class RenamePagesDomainsDomainTypeToScope < ActiveRecord::Migration[5.2] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + rename_column_concurrently :pages_domains, :domain_type, :scope + end + + def down + undo_rename_column_concurrently :pages_domains, :domain_type, :scope + end +end diff --git a/db/post_migrate/20200129035708_cleanup_rename_pages_domains_domain_type_to_scope.rb b/db/post_migrate/20200129035708_cleanup_rename_pages_domains_domain_type_to_scope.rb new file mode 100644 index 00000000000..d1d2b4962dd --- /dev/null +++ b/db/post_migrate/20200129035708_cleanup_rename_pages_domains_domain_type_to_scope.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class CleanupRenamePagesDomainsDomainTypeToScope < ActiveRecord::Migration[5.2] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + cleanup_concurrent_column_rename :pages_domains, :domain_type, :scope + end + + def down + undo_cleanup_concurrent_column_rename :pages_domains, :domain_type, :scope + end +end diff --git a/db/schema.rb b/db/schema.rb index 70e93a63148..98f127020de 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_01_27_090233) do +ActiveRecord::Schema.define(version: 2020_01_29_035708) do # These are extensions that must be enabled in order to support this database enable_extension "pg_trgm" @@ -3018,13 +3018,15 @@ ActiveRecord::Schema.define(version: 2020_01_27_090233) do t.datetime_with_timezone "certificate_valid_not_after" t.integer "certificate_source", limit: 2, default: 0, null: false t.boolean "wildcard", default: false, null: false - t.integer "domain_type", limit: 2, default: 2, null: false + t.integer "usage", limit: 2, default: 0, null: false + t.integer "scope", limit: 2, default: 2, null: false t.index ["certificate_source", "certificate_valid_not_after"], name: "index_pages_domains_need_auto_ssl_renewal", where: "(auto_ssl_enabled = true)" - t.index ["domain"], name: "index_pages_domains_on_domain", unique: true - t.index ["domain_type"], name: "index_pages_domains_on_domain_type" + t.index ["domain", "wildcard"], name: "index_pages_domains_on_domain_and_wildcard", unique: true t.index ["project_id", "enabled_until"], name: "index_pages_domains_on_project_id_and_enabled_until" t.index ["project_id"], name: "index_pages_domains_on_project_id" t.index ["remove_at"], name: "index_pages_domains_on_remove_at" + t.index ["scope"], name: "index_pages_domains_on_scope" + t.index ["usage"], name: "index_pages_domains_on_usage" t.index ["verified_at", "enabled_until"], name: "index_pages_domains_on_verified_at_and_enabled_until" t.index ["verified_at"], name: "index_pages_domains_on_verified_at" t.index ["wildcard"], name: "index_pages_domains_on_wildcard" diff --git a/lib/api/releases.rb b/lib/api/releases.rb index 506d2b0f985..b1f23d9837f 100644 --- a/lib/api/releases.rb +++ b/lib/api/releases.rb @@ -67,6 +67,7 @@ module API if result[:status] == :success log_release_created_audit_event(result[:release]) + create_evidence! present result[:release], with: Entities::Release, current_user: current_user else @@ -164,6 +165,16 @@ module API def log_release_milestones_updated_audit_event # This is a separate method so that EE can extend its behaviour end + + def create_evidence! + return if release.historical_release? + + if release.upcoming_release? + CreateEvidenceWorker.perform_at(release.released_at, release.id) + else + CreateEvidenceWorker.perform_async(release.id) + end + end end end end diff --git a/spec/factories/pages_domains.rb b/spec/factories/pages_domains.rb index 282783dee3a..7606e806e04 100644 --- a/spec/factories/pages_domains.rb +++ b/spec/factories/pages_domains.rb @@ -377,7 +377,8 @@ x6zG6WoibsbsJMj70nwseUnPTBQNDP+j61RJjC/r trait :instance_serverless do wildcard { true } - domain_type { :instance } + scope { :instance } + usage { :serverless } end end end diff --git a/spec/models/pages_domain_spec.rb b/spec/models/pages_domain_spec.rb index b1df13e8c2a..a88db3b87af 100644 --- a/spec/models/pages_domain_spec.rb +++ b/spec/models/pages_domain_spec.rb @@ -180,8 +180,12 @@ describe PagesDomain do expect(subject.wildcard).to eq(false) end - it 'defaults domain_type to project' do - expect(subject.domain_type).to eq('project') + it 'defaults scope to project' do + expect(subject.scope).to eq('project') + end + + it 'defaults usage to pages' do + expect(subject.usage).to eq('pages') end end @@ -315,11 +319,11 @@ describe PagesDomain do end describe '#update_daemon' do - context 'when domain_type is instance' do - it 'does nothing' do + context 'when usage is serverless' do + it 'does not call the UpdatePagesConfigurationService' do expect(Projects::UpdatePagesConfigurationService).not_to receive(:new) - create(:pages_domain, domain_type: :instance) + create(:pages_domain, usage: :serverless) end end diff --git a/spec/models/release_spec.rb b/spec/models/release_spec.rb index 2f84b92b806..85e398c7d5f 100644 --- a/spec/models/release_spec.rb +++ b/spec/models/release_spec.rb @@ -53,12 +53,6 @@ RSpec.describe Release do end end - describe 'callbacks' do - it 'creates a new Evidence object on after_commit', :sidekiq_inline do - expect { release }.to change(Evidence, :count).by(1) - end - end - describe '#assets_count' do subject { release.assets_count } diff --git a/spec/requests/api/releases_spec.rb b/spec/requests/api/releases_spec.rb index ae95b54a590..e0f88caeab6 100644 --- a/spec/requests/api/releases_spec.rb +++ b/spec/requests/api/releases_spec.rb @@ -9,6 +9,7 @@ describe API::Releases do let(:guest) { create(:user) } let(:non_project_member) { create(:user) } let(:commit) { create(:commit, project: project) } + let(:last_release) { project.releases.last } before do project.add_maintainer(maintainer) @@ -709,6 +710,109 @@ describe API::Releases do expect(response).to have_gitlab_http_status(:conflict) end end + + context 'Evidence collection' do + let(:params) do + { + name: 'New release', + tag_name: 'v0.1', + description: 'Super nice release', + released_at: released_at + }.compact + end + + around do |example| + Timecop.freeze { example.run } + end + + subject do + post api("/projects/#{project.id}/releases", maintainer), params: params + end + + context 'historical release' do + let(:released_at) { 3.weeks.ago } + + it 'does not execute CreateEvidenceWorker' do + expect { subject }.not_to change(CreateEvidenceWorker.jobs, :size) + end + + it 'does not create an Evidence object', :sidekiq_inline do + expect { subject }.not_to change(Evidence, :count) + end + + it 'is a historical release' do + subject + + expect(last_release.historical_release?).to be_truthy + end + + it 'is not an upcoming release' do + subject + + expect(last_release.upcoming_release?).to be_falsy + end + end + + context 'immediate release' do + let(:released_at) { nil } + + it 'sets `released_at` to the current dttm' do + subject + + expect(last_release.updated_at).to be_like_time(Time.now) + end + + it 'queues CreateEvidenceWorker' do + expect { subject }.to change(CreateEvidenceWorker.jobs, :size).by(1) + end + + it 'creates Evidence', :sidekiq_inline do + expect { subject }.to change(Evidence, :count).by(1) + end + + it 'is not a historical release' do + subject + + expect(last_release.historical_release?).to be_falsy + end + + it 'is not an upcoming release' do + subject + + expect(last_release.upcoming_release?).to be_falsy + end + end + + context 'upcoming release' do + let(:released_at) { 1.day.from_now } + + it 'queues CreateEvidenceWorker' do + expect { subject }.to change(CreateEvidenceWorker.jobs, :size).by(1) + end + + it 'queues CreateEvidenceWorker at the released_at timestamp' do + subject + + expect(CreateEvidenceWorker.jobs.last['at']).to eq(released_at.to_i) + end + + it 'creates Evidence', :sidekiq_inline do + expect { subject }.to change(Evidence, :count).by(1) + end + + it 'is not a historical release' do + subject + + expect(last_release.historical_release?).to be_falsy + end + + it 'is an upcoming release' do + subject + + expect(last_release.upcoming_release?).to be_truthy + end + end + end end describe 'PUT /projects/:id/releases/:tag_name' do |