diff options
45 files changed, 897 insertions, 1443 deletions
diff --git a/.rubocop_manual_todo.yml b/.rubocop_manual_todo.yml index 3e65a2af2ed..cb181787494 100644 --- a/.rubocop_manual_todo.yml +++ b/.rubocop_manual_todo.yml @@ -2445,11 +2445,6 @@ Database/MultipleDatabases: - 'lib/gitlab/database/migrations/observers/query_log.rb' - 'lib/gitlab/database/multi_threaded_migration.rb' - 'lib/gitlab/database/partitioning_migration_helpers/backfill_partitioned_table.rb' - - 'lib/gitlab/database/partitioning/monthly_strategy.rb' - - 'lib/gitlab/database/partitioning/partition_manager.rb' - - 'lib/gitlab/database/partitioning/partition_creator.rb' - - 'lib/gitlab/database/partitioning/replace_table.rb' - - 'lib/gitlab/database/partitioning/time_partition.rb' - 'lib/gitlab/database/postgres_hll/batch_distinct_counter.rb' - 'lib/gitlab/database/postgresql_adapter/dump_schema_versions_mixin.rb' - 'lib/gitlab/database/postgresql_database_tasks/load_schema_versions_mixin.rb' diff --git a/app/assets/javascripts/emoji/index.js b/app/assets/javascripts/emoji/index.js index c0f2153ce5b..478e3f6aed9 100644 --- a/app/assets/javascripts/emoji/index.js +++ b/app/assets/javascripts/emoji/index.js @@ -10,7 +10,7 @@ let validEmojiNames = null; export const FALLBACK_EMOJI_KEY = 'grey_question'; // Keep the version in sync with `lib/gitlab/emoji.rb` -export const EMOJI_VERSION = '2'; +export const EMOJI_VERSION = '1'; const isLocalStorageAvailable = AccessorUtilities.canUseLocalStorage(); diff --git a/app/assets/javascripts/group_settings/components/shared_runners_form.vue b/app/assets/javascripts/group_settings/components/shared_runners_form.vue index f61d96b3dfd..dcac337c6ef 100644 --- a/app/assets/javascripts/group_settings/components/shared_runners_form.vue +++ b/app/assets/javascripts/group_settings/components/shared_runners_form.vue @@ -3,13 +3,7 @@ import { GlToggle, GlLoadingIcon, GlTooltip, GlAlert } from '@gitlab/ui'; import { debounce } from 'lodash'; import axios from '~/lib/utils/axios_utils'; import { __ } from '~/locale'; -import { - DEBOUNCE_TOGGLE_DELAY, - ERROR_MESSAGE, - ENABLED, - DISABLED, - ALLOW_OVERRIDE, -} from '../constants'; +import { DEBOUNCE_TOGGLE_DELAY, ERROR_MESSAGE } from '../constants'; export default { components: { @@ -18,21 +12,14 @@ export default { GlTooltip, GlAlert, }, - props: { - updatePath: { - type: String, - required: true, - }, - sharedRunnersAvailability: { - type: String, - required: true, - }, - parentSharedRunnersAvailability: { - type: String, - required: false, - default: '', - }, - }, + inject: [ + 'updatePath', + 'sharedRunnersAvailability', + 'parentSharedRunnersAvailability', + 'runnerEnabled', + 'runnerDisabled', + 'runnerAllowOverride', + ], data() { return { isLoading: false, @@ -43,21 +30,21 @@ export default { }, computed: { toggleDisabled() { - return this.parentSharedRunnersAvailability === DISABLED || this.isLoading; + return this.parentSharedRunnersAvailability === this.runnerDisabled || this.isLoading; }, enabledOrDisabledSetting() { - return this.enabled ? ENABLED : DISABLED; + return this.enabled ? this.runnerEnabled : this.runnerDisabled; }, disabledWithOverrideSetting() { - return this.allowOverride ? ALLOW_OVERRIDE : DISABLED; + return this.allowOverride ? this.runnerAllowOverride : this.runnerDisabled; }, }, created() { - if (this.sharedRunnersAvailability !== ENABLED) { + if (this.sharedRunnersAvailability !== this.runnerEnabled) { this.enabled = false; } - if (this.sharedRunnersAvailability === ALLOW_OVERRIDE) { + if (this.sharedRunnersAvailability === this.runnerAllowOverride) { this.allowOverride = true; } }, diff --git a/app/assets/javascripts/group_settings/constants.js b/app/assets/javascripts/group_settings/constants.js index c7bb851c06b..4067b6b52a3 100644 --- a/app/assets/javascripts/group_settings/constants.js +++ b/app/assets/javascripts/group_settings/constants.js @@ -4,8 +4,3 @@ import { __ } from '~/locale'; export const DEBOUNCE_TOGGLE_DELAY = 1000; export const ERROR_MESSAGE = __('Refresh the page and try again.'); - -// runner setting options -export const ENABLED = 'enabled'; -export const DISABLED = 'disabled_and_unoverridable'; -export const ALLOW_OVERRIDE = 'disabled_with_override'; diff --git a/app/assets/javascripts/group_settings/mount_shared_runners.js b/app/assets/javascripts/group_settings/mount_shared_runners.js index 44284204c41..27558e43d2b 100644 --- a/app/assets/javascripts/group_settings/mount_shared_runners.js +++ b/app/assets/javascripts/group_settings/mount_shared_runners.js @@ -4,11 +4,27 @@ import UpdateSharedRunnersForm from './components/shared_runners_form.vue'; export default (containerId = 'update-shared-runners-form') => { const containerEl = document.getElementById(containerId); + const { + updatePath, + sharedRunnersAvailability, + parentSharedRunnersAvailability, + runnerEnabled, + runnerDisabled, + runnerAllowOverride, + } = containerEl.dataset; + return new Vue({ el: containerEl, render(createElement) { return createElement(UpdateSharedRunnersForm, { - props: containerEl.dataset, + provide: { + updatePath, + sharedRunnersAvailability, + parentSharedRunnersAvailability, + runnerEnabled, + runnerDisabled, + runnerAllowOverride, + }, }); }, }); diff --git a/app/helpers/ci/runners_helper.rb b/app/helpers/ci/runners_helper.rb index ec10610714b..bbeb74faf2b 100644 --- a/app/helpers/ci/runners_helper.rb +++ b/app/helpers/ci/runners_helper.rb @@ -61,7 +61,10 @@ module Ci { update_path: api_v4_groups_path(id: group.id), shared_runners_availability: group.shared_runners_setting, - parent_shared_runners_availability: group.parent&.shared_runners_setting + parent_shared_runners_availability: group.parent&.shared_runners_setting, + runner_enabled: Namespace::SR_ENABLED, + runner_disabled: Namespace::SR_DISABLED_AND_UNOVERRIDABLE, + runner_allow_override: Namespace::SR_DISABLED_WITH_OVERRIDE } end diff --git a/app/models/application_record.rb b/app/models/application_record.rb index d2757d8c17d..7737614ae25 100644 --- a/app/models/application_record.rb +++ b/app/models/application_record.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true class ApplicationRecord < ActiveRecord::Base - self.gitlab_schema = :gitlab_main self.abstract_class = true alias_method :reset, :reload diff --git a/app/models/ci/application_record.rb b/app/models/ci/application_record.rb index 913e7a62c66..9d4a8f0648e 100644 --- a/app/models/ci/application_record.rb +++ b/app/models/ci/application_record.rb @@ -2,7 +2,6 @@ module Ci class ApplicationRecord < ::ApplicationRecord - self.gitlab_schema = :gitlab_ci self.abstract_class = true def self.table_name_prefix diff --git a/app/models/concerns/loose_foreign_key.rb b/app/models/concerns/loose_foreign_key.rb index 4e822a04869..8bbd6980d4d 100644 --- a/app/models/concerns/loose_foreign_key.rb +++ b/app/models/concerns/loose_foreign_key.rb @@ -69,7 +69,7 @@ module LooseForeignKey end on_delete_options = %i[async_delete async_nullify] - gitlab_schema_options = [ApplicationRecord.gitlab_schema, Ci::ApplicationRecord.gitlab_schema] + gitlab_schema_options = %i(gitlab_main gitlab_ci) unless on_delete_options.include?(symbolized_options[:on_delete]&.to_sym) raise "Invalid on_delete option given: #{symbolized_options[:on_delete]}. Valid options: #{on_delete_options.join(', ')}" diff --git a/app/workers/database/drop_detached_partitions_worker.rb b/app/workers/database/drop_detached_partitions_worker.rb index 1e4dc20a0d2..126c46a338b 100644 --- a/app/workers/database/drop_detached_partitions_worker.rb +++ b/app/workers/database/drop_detached_partitions_worker.rb @@ -12,7 +12,7 @@ module Database def perform Gitlab::Database::Partitioning.drop_detached_partitions ensure - Gitlab::Database::Partitioning::PartitionMonitoring.new.report_metrics + Gitlab::Database::Partitioning.report_metrics end end end diff --git a/app/workers/database/partition_management_worker.rb b/app/workers/database/partition_management_worker.rb index 5a1f139dc29..ba1ad7a0e81 100644 --- a/app/workers/database/partition_management_worker.rb +++ b/app/workers/database/partition_management_worker.rb @@ -14,7 +14,7 @@ module Database def perform Gitlab::Database::Partitioning.sync_partitions ensure - Gitlab::Database::Partitioning::PartitionMonitoring.new.report_metrics + Gitlab::Database::Partitioning.report_metrics end end end diff --git a/config/initializers/00_active_record_gitlab_schema.rb b/config/initializers/00_active_record_gitlab_schema.rb deleted file mode 100644 index f1ddd4d4eb1..00000000000 --- a/config/initializers/00_active_record_gitlab_schema.rb +++ /dev/null @@ -1,10 +0,0 @@ -# frozen_string_literal: true - -# This parameter describes a virtual context to indicate -# table affinity to other tables. -# -# Table affinity limits cross-joins, cross-modifications, -# foreign keys and validates relationship between tables -# -# By default it is undefined -ActiveRecord::Base.class_attribute :gitlab_schema, default: nil diff --git a/config/initializers/0_acts_as_taggable.rb b/config/initializers/0_acts_as_taggable.rb index 8dee3c52a53..3cf44628995 100644 --- a/config/initializers/0_acts_as_taggable.rb +++ b/config/initializers/0_acts_as_taggable.rb @@ -13,7 +13,3 @@ raise "Counter cache is not disabled" if ActsAsTaggableOn::Tagging.include IgnorableColumns ActsAsTaggableOn::Tagging.ignore_column :id_convert_to_bigint, remove_with: '14.5', remove_after: '2021-10-22' ActsAsTaggableOn::Tagging.ignore_column :taggable_id_convert_to_bigint, remove_with: '14.5', remove_after: '2021-10-22' - -# The tags and taggings are supposed to be part of `gitlab_ci` -ActsAsTaggableOn::Tag.gitlab_schema = :gitlab_ci -ActsAsTaggableOn::Tagging.gitlab_schema = :gitlab_ci diff --git a/db/migrate/20210629031900_associate_existing_dast_builds_with_variables.rb b/db/migrate/20210629031900_associate_existing_dast_builds_with_variables.rb index 3d81db87143..5db39334550 100644 --- a/db/migrate/20210629031900_associate_existing_dast_builds_with_variables.rb +++ b/db/migrate/20210629031900_associate_existing_dast_builds_with_variables.rb @@ -20,7 +20,6 @@ class AssociateExistingDastBuildsWithVariables < ActiveRecord::Migration[6.1] class Build < ApplicationRecord self.table_name = 'ci_builds' self.inheritance_column = :_type_disabled - self.gitlab_schema = :gitlab_ci default_scope { where(name: :dast, stage: :dast) } # rubocop:disable Cop/DefaultScope end diff --git a/doc/ci/pipelines/settings.md b/doc/ci/pipelines/settings.md index e14c1aa621f..a8ecb5e0d74 100644 --- a/doc/ci/pipelines/settings.md +++ b/doc/ci/pipelines/settings.md @@ -78,7 +78,7 @@ To avoid this scenario: 1. Select the **Skip outdated deployment jobs** checkbox. 1. Select **Save changes**. -Older deployment job are skipped when a new deployment starts. +Older deployment jobs are skipped when a new deployment starts. For more information, see [Deployment safety](../environments/deployment_safety.md). diff --git a/doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v14_2.png b/doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v14_2.png Binary files differdeleted file mode 100644 index 52249cef343..00000000000 --- a/doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v14_2.png +++ /dev/null diff --git a/doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v14_4.png b/doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v14_4.png Binary files differnew file mode 100644 index 00000000000..ac123d2b528 --- /dev/null +++ b/doc/user/application_security/security_dashboard/img/pipeline_security_dashboard_v14_4.png diff --git a/doc/user/application_security/security_dashboard/index.md b/doc/user/application_security/security_dashboard/index.md index c78179e9693..87875ec15ba 100644 --- a/doc/user/application_security/security_dashboard/index.md +++ b/doc/user/application_security/security_dashboard/index.md @@ -51,7 +51,7 @@ The security dashboard and vulnerability report displays information about vulne At the pipeline level, the Security section displays the vulnerabilities present in the branch of the project the pipeline ran against. -![Pipeline Security Dashboard](img/pipeline_security_dashboard_v14_2.png) +![Pipeline Security Dashboard](img/pipeline_security_dashboard_v14_4.png) Visit the page for any pipeline that ran any of the [supported reports](#supported-reports). To view the pipeline's security findings, select the **Security** tab when viewing the pipeline. @@ -64,11 +64,15 @@ the analyzer outputs an ### Scan details -> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3728) in GitLab 13.10. +> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/3728) in GitLab 13.10. +> - [Improved](https://gitlab.com/gitlab-org/gitlab/-/issues/333660) in GitLab 14.2. -The **Scan details** section lists the scans run in the pipeline and the total number of -vulnerabilities per scan. For the DAST scan, select **Download scanned resources** to download a -CSV file containing details of the resources scanned. +The **Scan details** section lists the scans run in the pipeline and the total number of vulnerabilities +per scan. + +You can download the JSON artifacts from each security scan. Select **Download results** then +select the JSON artifact. Additionally for the DAST scan, from the **Download results** dropdown select +**Download scanned resources** to download a CSV file containing details of the resources scanned. ## Project Security Dashboard diff --git a/lib/gitlab/database/each_database.rb b/lib/gitlab/database/each_database.rb new file mode 100644 index 00000000000..c9b07490594 --- /dev/null +++ b/lib/gitlab/database/each_database.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +module Gitlab + module Database + module EachDatabase + class << self + def each_database_connection + Gitlab::Database.databases.each_pair do |connection_name, connection_wrapper| + connection = connection_wrapper.scope.connection + + with_shared_connection(connection, connection_name) do + yield connection, connection_name + end + end + end + + def each_model_connection(models) + models.each do |model| + connection_name = model.connection.pool.db_config.name + + with_shared_connection(model.connection, connection_name) do + yield model, connection_name + end + end + end + + private + + def with_shared_connection(connection, connection_name) + Gitlab::Database::SharedModel.using_connection(connection) do + Gitlab::AppLogger.debug(message: 'Switched database connection', connection_name: connection_name) + + yield + end + end + end + end + end +end diff --git a/lib/gitlab/database/partitioning.rb b/lib/gitlab/database/partitioning.rb index 71fb995577a..c517cf94c6e 100644 --- a/lib/gitlab/database/partitioning.rb +++ b/lib/gitlab/database/partitioning.rb @@ -12,11 +12,31 @@ module Gitlab end def self.sync_partitions(models_to_sync = registered_models) - MultiDatabasePartitionManager.new(models_to_sync).sync_partitions + Gitlab::AppLogger.info(message: 'Syncing dynamic postgres partitions') + + Gitlab::Database::EachDatabase.each_model_connection(models_to_sync) do |model| + PartitionManager.new(model).sync_partitions + end + + Gitlab::AppLogger.info(message: 'Finished sync of dynamic postgres partitions') + end + + def self.report_metrics(models_to_monitor = registered_models) + partition_monitoring = PartitionMonitoring.new + + Gitlab::Database::EachDatabase.each_model_connection(models_to_monitor) do |model| + partition_monitoring.report_metrics_for_model(model) + end end def self.drop_detached_partitions - MultiDatabasePartitionDropper.new.drop_detached_partitions + Gitlab::AppLogger.info(message: 'Dropping detached postgres partitions') + + Gitlab::Database::EachDatabase.each_database_connection do + DetachedPartitionDropper.new.perform + end + + Gitlab::AppLogger.info(message: 'Finished dropping detached postgres partitions') end end end diff --git a/lib/gitlab/database/partitioning/monthly_strategy.rb b/lib/gitlab/database/partitioning/monthly_strategy.rb index 4cdde5bf2f1..c93e775d7ed 100644 --- a/lib/gitlab/database/partitioning/monthly_strategy.rb +++ b/lib/gitlab/database/partitioning/monthly_strategy.rb @@ -96,10 +96,6 @@ module Gitlab def oldest_active_date (Date.today - retain_for).beginning_of_month end - - def connection - ActiveRecord::Base.connection - end end end end diff --git a/lib/gitlab/database/partitioning/multi_database_partition_dropper.rb b/lib/gitlab/database/partitioning/multi_database_partition_dropper.rb deleted file mode 100644 index 769b658bae4..00000000000 --- a/lib/gitlab/database/partitioning/multi_database_partition_dropper.rb +++ /dev/null @@ -1,35 +0,0 @@ -# frozen_string_literal: true - -module Gitlab - module Database - module Partitioning - class MultiDatabasePartitionDropper - def drop_detached_partitions - Gitlab::AppLogger.info(message: "Dropping detached postgres partitions") - - each_database_connection do |name, connection| - Gitlab::Database::SharedModel.using_connection(connection) do - Gitlab::AppLogger.debug(message: "Switched database connection", connection_name: name) - - DetachedPartitionDropper.new.perform - end - end - - Gitlab::AppLogger.info(message: "Finished dropping detached postgres partitions") - end - - private - - def each_database_connection - databases.each_pair do |name, connection_wrapper| - yield name, connection_wrapper.scope.connection - end - end - - def databases - Gitlab::Database.databases - end - end - end - end -end diff --git a/lib/gitlab/database/partitioning/multi_database_partition_manager.rb b/lib/gitlab/database/partitioning/multi_database_partition_manager.rb deleted file mode 100644 index 5a93e3fb1fb..00000000000 --- a/lib/gitlab/database/partitioning/multi_database_partition_manager.rb +++ /dev/null @@ -1,37 +0,0 @@ -# frozen_string_literal: true - -module Gitlab - module Database - module Partitioning - class MultiDatabasePartitionManager - def initialize(models) - @models = models - end - - def sync_partitions - Gitlab::AppLogger.info(message: "Syncing dynamic postgres partitions") - - models.each do |model| - Gitlab::Database::SharedModel.using_connection(model.connection) do - Gitlab::AppLogger.debug(message: "Switched database connection", - connection_name: connection_name, - table_name: model.table_name) - - PartitionManager.new(model).sync_partitions - end - end - - Gitlab::AppLogger.info(message: "Finished sync of dynamic postgres partitions") - end - - private - - attr_reader :models - - def connection_name - Gitlab::Database::SharedModel.connection.pool.db_config.name - end - end - end - end -end diff --git a/lib/gitlab/database/partitioning/partition_monitoring.rb b/lib/gitlab/database/partitioning/partition_monitoring.rb index e5b561fc447..1a23f58285d 100644 --- a/lib/gitlab/database/partitioning/partition_monitoring.rb +++ b/lib/gitlab/database/partitioning/partition_monitoring.rb @@ -4,20 +4,12 @@ module Gitlab module Database module Partitioning class PartitionMonitoring - attr_reader :models + def report_metrics_for_model(model) + strategy = model.partitioning_strategy - def initialize(models = Gitlab::Database::Partitioning.registered_models) - @models = models - end - - def report_metrics - models.each do |model| - strategy = model.partitioning_strategy - - gauge_present.set({ table: model.table_name }, strategy.current_partitions.size) - gauge_missing.set({ table: model.table_name }, strategy.missing_partitions.size) - gauge_extra.set({ table: model.table_name }, strategy.extra_partitions.size) - end + gauge_present.set({ table: model.table_name }, strategy.current_partitions.size) + gauge_missing.set({ table: model.table_name }, strategy.missing_partitions.size) + gauge_extra.set({ table: model.table_name }, strategy.extra_partitions.size) end private diff --git a/lib/gitlab/database/partitioning/replace_table.rb b/lib/gitlab/database/partitioning/replace_table.rb index 6f6af223fa2..a7686e97553 100644 --- a/lib/gitlab/database/partitioning/replace_table.rb +++ b/lib/gitlab/database/partitioning/replace_table.rb @@ -9,7 +9,8 @@ module Gitlab attr_reader :original_table, :replacement_table, :replaced_table, :primary_key_column, :sequence, :original_primary_key, :replacement_primary_key, :replaced_primary_key - def initialize(original_table, replacement_table, replaced_table, primary_key_column) + def initialize(connection, original_table, replacement_table, replaced_table, primary_key_column) + @connection = connection @original_table = original_table @replacement_table = replacement_table @replaced_table = replaced_table @@ -29,10 +30,8 @@ module Gitlab private + attr_reader :connection delegate :execute, :quote_table_name, :quote_column_name, to: :connection - def connection - @connection ||= ActiveRecord::Base.connection - end def default_sequence(table, column) "#{table}_#{column}_seq" diff --git a/lib/gitlab/database/partitioning/time_partition.rb b/lib/gitlab/database/partitioning/time_partition.rb index e09ca483549..649687bdd12 100644 --- a/lib/gitlab/database/partitioning/time_partition.rb +++ b/lib/gitlab/database/partitioning/time_partition.rb @@ -87,7 +87,7 @@ module Gitlab end def conn - @conn ||= ActiveRecord::Base.connection + @conn ||= Gitlab::Database::SharedModel.connection end end end diff --git a/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb b/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb index 0dc9f92e4c8..c382d2f0715 100644 --- a/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb +++ b/lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb @@ -428,8 +428,8 @@ module Gitlab end def replace_table(original_table_name, replacement_table_name, replaced_table_name, primary_key_name) - replace_table = Gitlab::Database::Partitioning::ReplaceTable.new(original_table_name.to_s, - replacement_table_name, replaced_table_name, primary_key_name) + replace_table = Gitlab::Database::Partitioning::ReplaceTable.new(connection, + original_table_name.to_s, replacement_table_name, replaced_table_name, primary_key_name) transaction do drop_sync_trigger(original_table_name) diff --git a/lib/gitlab/emoji.rb b/lib/gitlab/emoji.rb index 3c5d223b106..519b1d94bf5 100644 --- a/lib/gitlab/emoji.rb +++ b/lib/gitlab/emoji.rb @@ -6,7 +6,7 @@ module Gitlab # When updating emoji assets increase the version below # and update the version number in `app/assets/javascripts/emoji/index.js` - EMOJI_VERSION = 2 + EMOJI_VERSION = 1 # Return a Pathname to emoji's current versioned folder # diff --git a/lib/gitlab/zentao/client.rb b/lib/gitlab/zentao/client.rb index e22d57faeca..481dca0b57c 100644 --- a/lib/gitlab/zentao/client.rb +++ b/lib/gitlab/zentao/client.rb @@ -16,7 +16,7 @@ module Gitlab def ping response = fetch_product(zentao_product_xid) rescue {} - active = response.fetch('deleted') == '0' rescue false + active = response['deleted'] == '0' if active { success: true } else diff --git a/spec/frontend/group_settings/components/shared_runners_form_spec.js b/spec/frontend/group_settings/components/shared_runners_form_spec.js index 78950a8fe20..617d91178e4 100644 --- a/spec/frontend/group_settings/components/shared_runners_form_spec.js +++ b/spec/frontend/group_settings/components/shared_runners_form_spec.js @@ -3,13 +3,16 @@ import { shallowMount } from '@vue/test-utils'; import MockAxiosAdapter from 'axios-mock-adapter'; import waitForPromises from 'helpers/wait_for_promises'; import SharedRunnersForm from '~/group_settings/components/shared_runners_form.vue'; -import { ENABLED, DISABLED, ALLOW_OVERRIDE } from '~/group_settings/constants'; import axios from '~/lib/utils/axios_utils'; -const TEST_UPDATE_PATH = '/test/update'; -const DISABLED_PAYLOAD = { shared_runners_setting: DISABLED }; -const ENABLED_PAYLOAD = { shared_runners_setting: ENABLED }; -const OVERRIDE_PAYLOAD = { shared_runners_setting: ALLOW_OVERRIDE }; +const provide = { + updatePath: '/test/update', + sharedRunnersAvailability: 'enabled', + parentSharedRunnersAvailability: null, + runnerDisabled: 'disabled', + runnerEnabled: 'enabled', + runnerAllowOverride: 'allow_override', +}; jest.mock('~/flash'); @@ -17,13 +20,11 @@ describe('group_settings/components/shared_runners_form', () => { let wrapper; let mock; - const createComponent = (props = {}) => { + const createComponent = (provides = {}) => { wrapper = shallowMount(SharedRunnersForm, { - propsData: { - updatePath: TEST_UPDATE_PATH, - sharedRunnersAvailability: ENABLED, - parentSharedRunnersAvailability: null, - ...props, + provide: { + ...provide, + ...provides, }, }); }; @@ -33,13 +34,13 @@ describe('group_settings/components/shared_runners_form', () => { const findEnabledToggle = () => wrapper.find('[data-testid="enable-runners-toggle"]'); const findOverrideToggle = () => wrapper.find('[data-testid="override-runners-toggle"]'); const changeToggle = (toggle) => toggle.vm.$emit('change', !toggle.props('value')); - const getRequestPayload = () => JSON.parse(mock.history.put[0].data); + const getSharedRunnersSetting = () => JSON.parse(mock.history.put[0].data).shared_runners_setting; const isLoadingIconVisible = () => findLoadingIcon().exists(); beforeEach(() => { mock = new MockAxiosAdapter(axios); - mock.onPut(TEST_UPDATE_PATH).reply(200); + mock.onPut(provide.updatePath).reply(200); }); afterEach(() => { @@ -95,7 +96,7 @@ describe('group_settings/components/shared_runners_form', () => { await waitForPromises(); - expect(getRequestPayload()).toEqual(ENABLED_PAYLOAD); + expect(getSharedRunnersSetting()).toEqual(provide.runnerEnabled); expect(findOverrideToggle().exists()).toBe(false); }); @@ -104,14 +105,14 @@ describe('group_settings/components/shared_runners_form', () => { await waitForPromises(); - expect(getRequestPayload()).toEqual(DISABLED_PAYLOAD); + expect(getSharedRunnersSetting()).toEqual(provide.runnerDisabled); expect(findOverrideToggle().exists()).toBe(true); }); }); describe('override toggle', () => { beforeEach(() => { - createComponent({ sharedRunnersAvailability: ALLOW_OVERRIDE }); + createComponent({ sharedRunnersAvailability: provide.runnerAllowOverride }); }); it('enabling the override toggle sends correct payload', async () => { @@ -119,7 +120,7 @@ describe('group_settings/components/shared_runners_form', () => { await waitForPromises(); - expect(getRequestPayload()).toEqual(OVERRIDE_PAYLOAD); + expect(getSharedRunnersSetting()).toEqual(provide.runnerAllowOverride); }); it('disabling the override toggle sends correct payload', async () => { @@ -127,21 +128,21 @@ describe('group_settings/components/shared_runners_form', () => { await waitForPromises(); - expect(getRequestPayload()).toEqual(DISABLED_PAYLOAD); + expect(getSharedRunnersSetting()).toEqual(provide.runnerDisabled); }); }); describe('toggle disabled state', () => { - it(`toggles are not disabled with setting ${DISABLED}`, () => { - createComponent({ sharedRunnersAvailability: DISABLED }); + it(`toggles are not disabled with setting ${provide.runnerDisabled}`, () => { + createComponent({ sharedRunnersAvailability: provide.runnerDisabled }); expect(findEnabledToggle().props('disabled')).toBe(false); expect(findOverrideToggle().props('disabled')).toBe(false); }); it('toggles are disabled', () => { createComponent({ - sharedRunnersAvailability: DISABLED, - parentSharedRunnersAvailability: DISABLED, + sharedRunnersAvailability: provide.runnerDisabled, + parentSharedRunnersAvailability: provide.runnerDisabled, }); expect(findEnabledToggle().props('disabled')).toBe(true); expect(findOverrideToggle().props('disabled')).toBe(true); @@ -154,7 +155,7 @@ describe('group_settings/components/shared_runners_form', () => { ${{ error: 'Undefined error' }} | ${'Undefined error Refresh the page and try again.'} `(`with error $errorObj`, ({ errorObj, message }) => { beforeEach(async () => { - mock.onPut(TEST_UPDATE_PATH).reply(500, errorObj); + mock.onPut(provide.updatePath).reply(500, errorObj); createComponent(); changeToggle(findEnabledToggle()); diff --git a/spec/helpers/ci/runners_helper_spec.rb b/spec/helpers/ci/runners_helper_spec.rb index 49ea2ac8d3b..513a8d20144 100644 --- a/spec/helpers/ci/runners_helper_spec.rb +++ b/spec/helpers/ci/runners_helper_spec.rb @@ -68,23 +68,35 @@ RSpec.describe Ci::RunnersHelper do end describe '#group_shared_runners_settings_data' do - let(:group) { create(:group, parent: parent, shared_runners_enabled: false) } - let(:parent) { create(:group) } + let_it_be(:parent) { create(:group) } + let_it_be(:group) { create(:group, parent: parent, shared_runners_enabled: false) } + + let(:runner_constants) do + { + runner_enabled: Namespace::SR_ENABLED, + runner_disabled: Namespace::SR_DISABLED_AND_UNOVERRIDABLE, + runner_allow_override: Namespace::SR_DISABLED_WITH_OVERRIDE + } + end it 'returns group data for top level group' do - data = group_shared_runners_settings_data(parent) + result = { + update_path: "/api/v4/groups/#{parent.id}", + shared_runners_availability: Namespace::SR_ENABLED, + parent_shared_runners_availability: nil + }.merge(runner_constants) - expect(data[:update_path]).to eq("/api/v4/groups/#{parent.id}") - expect(data[:shared_runners_availability]).to eq('enabled') - expect(data[:parent_shared_runners_availability]).to eq(nil) + expect(group_shared_runners_settings_data(parent)).to eq result end it 'returns group data for child group' do - data = group_shared_runners_settings_data(group) + result = { + update_path: "/api/v4/groups/#{group.id}", + shared_runners_availability: Namespace::SR_DISABLED_AND_UNOVERRIDABLE, + parent_shared_runners_availability: Namespace::SR_ENABLED + }.merge(runner_constants) - expect(data[:update_path]).to eq("/api/v4/groups/#{group.id}") - expect(data[:shared_runners_availability]).to eq(Namespace::SR_DISABLED_AND_UNOVERRIDABLE) - expect(data[:parent_shared_runners_availability]).to eq('enabled') + expect(group_shared_runners_settings_data(group)).to eq result end end diff --git a/spec/lib/gitlab/database/each_database_spec.rb b/spec/lib/gitlab/database/each_database_spec.rb new file mode 100644 index 00000000000..8523249d804 --- /dev/null +++ b/spec/lib/gitlab/database/each_database_spec.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::Database::EachDatabase do + describe '.each_database' do + let(:expected_connections) do + Gitlab::Database.databases.map { |name, wrapper| [wrapper.scope.connection, name] } + end + + it 'yields each connection after connecting SharedModel' do + expected_connections.each do |connection, _| + expect(Gitlab::Database::SharedModel).to receive(:using_connection).with(connection).and_yield + end + + yielded_connections = [] + + described_class.each_database_connection do |connection, name| + yielded_connections << [connection, name] + end + + expect(yielded_connections).to match_array(expected_connections) + end + end + + describe '.each_model_connection' do + let(:model1) { double(connection: double, table_name: 'table1') } + let(:model2) { double(connection: double, table_name: 'table2') } + + before do + allow(model1.connection).to receive_message_chain('pool.db_config.name').and_return('name1') + allow(model2.connection).to receive_message_chain('pool.db_config.name').and_return('name2') + end + + it 'yields each model after connecting SharedModel' do + expect(Gitlab::Database::SharedModel).to receive(:using_connection).with(model1.connection).and_yield + expect(Gitlab::Database::SharedModel).to receive(:using_connection).with(model2.connection).and_yield + + yielded_models = [] + + described_class.each_model_connection([model1, model2]) do |model, name| + yielded_models << [model, name] + end + + expect(yielded_models).to match_array([[model1, 'name1'], [model2, 'name2']]) + end + end +end diff --git a/spec/lib/gitlab/database/partitioning/multi_database_partition_dropper_spec.rb b/spec/lib/gitlab/database/partitioning/multi_database_partition_dropper_spec.rb deleted file mode 100644 index 56d6ebb7aff..00000000000 --- a/spec/lib/gitlab/database/partitioning/multi_database_partition_dropper_spec.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Gitlab::Database::Partitioning::MultiDatabasePartitionDropper, '#drop_detached_partitions' do - subject(:drop_detached_partitions) { multi_db_dropper.drop_detached_partitions } - - let(:multi_db_dropper) { described_class.new } - - let(:connection_wrapper1) { double(scope: scope1) } - let(:connection_wrapper2) { double(scope: scope2) } - - let(:scope1) { double(connection: connection1) } - let(:scope2) { double(connection: connection2) } - - let(:connection1) { double('connection') } - let(:connection2) { double('connection') } - - let(:dropper_class) { Gitlab::Database::Partitioning::DetachedPartitionDropper } - let(:dropper1) { double('partition dropper') } - let(:dropper2) { double('partition dropper') } - - before do - allow(multi_db_dropper).to receive(:databases).and_return({ db1: connection_wrapper1, db2: connection_wrapper2 }) - end - - it 'drops detached partitions for each database' do - expect(Gitlab::Database::SharedModel).to receive(:using_connection).with(connection1).and_yield.ordered - expect(dropper_class).to receive(:new).and_return(dropper1).ordered - expect(dropper1).to receive(:perform) - - expect(Gitlab::Database::SharedModel).to receive(:using_connection).with(connection2).and_yield.ordered - expect(dropper_class).to receive(:new).and_return(dropper2).ordered - expect(dropper2).to receive(:perform) - - drop_detached_partitions - end -end diff --git a/spec/lib/gitlab/database/partitioning/multi_database_partition_manager_spec.rb b/spec/lib/gitlab/database/partitioning/multi_database_partition_manager_spec.rb deleted file mode 100644 index 3c94c1bf4ea..00000000000 --- a/spec/lib/gitlab/database/partitioning/multi_database_partition_manager_spec.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Gitlab::Database::Partitioning::MultiDatabasePartitionManager, '#sync_partitions' do - subject(:sync_partitions) { manager.sync_partitions } - - let(:manager) { described_class.new(models) } - let(:models) { [model1, model2] } - - let(:model1) { double('model1', connection: connection1, table_name: 'table1') } - let(:model2) { double('model2', connection: connection1, table_name: 'table2') } - - let(:connection1) { double('connection1') } - let(:connection2) { double('connection2') } - - let(:target_manager_class) { Gitlab::Database::Partitioning::PartitionManager } - let(:target_manager1) { double('partition manager') } - let(:target_manager2) { double('partition manager') } - - before do - allow(manager).to receive(:connection_name).and_return('name') - end - - it 'syncs model partitions, setting up the appropriate connection for each', :aggregate_failures do - expect(Gitlab::Database::SharedModel).to receive(:using_connection).with(model1.connection).and_yield.ordered - expect(target_manager_class).to receive(:new).with(model1).and_return(target_manager1).ordered - expect(target_manager1).to receive(:sync_partitions) - - expect(Gitlab::Database::SharedModel).to receive(:using_connection).with(model2.connection).and_yield.ordered - expect(target_manager_class).to receive(:new).with(model2).and_return(target_manager2).ordered - expect(target_manager2).to receive(:sync_partitions) - - sync_partitions - end -end diff --git a/spec/lib/gitlab/database/partitioning/partition_monitoring_spec.rb b/spec/lib/gitlab/database/partitioning/partition_monitoring_spec.rb index 7024cbd55ff..006ce8a7f48 100644 --- a/spec/lib/gitlab/database/partitioning/partition_monitoring_spec.rb +++ b/spec/lib/gitlab/database/partitioning/partition_monitoring_spec.rb @@ -4,9 +4,8 @@ require 'spec_helper' RSpec.describe Gitlab::Database::Partitioning::PartitionMonitoring do describe '#report_metrics' do - subject { described_class.new(models).report_metrics } + subject { described_class.new.report_metrics_for_model(model) } - let(:models) { [model] } let(:model) { double(partitioning_strategy: partitioning_strategy, table_name: table) } let(:partitioning_strategy) { double(missing_partitions: missing_partitions, current_partitions: current_partitions, extra_partitions: extra_partitions) } let(:table) { "some_table" } diff --git a/spec/lib/gitlab/database/partitioning/replace_table_spec.rb b/spec/lib/gitlab/database/partitioning/replace_table_spec.rb index 8e27797208c..fdf514b519f 100644 --- a/spec/lib/gitlab/database/partitioning/replace_table_spec.rb +++ b/spec/lib/gitlab/database/partitioning/replace_table_spec.rb @@ -5,7 +5,9 @@ require 'spec_helper' RSpec.describe Gitlab::Database::Partitioning::ReplaceTable, '#perform' do include Database::TableSchemaHelpers - subject(:replace_table) { described_class.new(original_table, replacement_table, archived_table, 'id').perform } + subject(:replace_table) do + described_class.new(connection, original_table, replacement_table, archived_table, 'id').perform + end let(:original_table) { '_test_original_table' } let(:replacement_table) { '_test_replacement_table' } diff --git a/spec/lib/gitlab/database/partitioning_spec.rb b/spec/lib/gitlab/database/partitioning_spec.rb index 486af9413e8..6841af8f69d 100644 --- a/spec/lib/gitlab/database/partitioning_spec.rb +++ b/spec/lib/gitlab/database/partitioning_spec.rb @@ -3,46 +3,121 @@ require 'spec_helper' RSpec.describe Gitlab::Database::Partitioning do + include Database::PartitioningHelpers + include Database::TableSchemaHelpers + + let(:connection) { ApplicationRecord.connection } + describe '.sync_partitions' do - let(:partition_manager_class) { described_class::MultiDatabasePartitionManager } - let(:partition_manager) { double('partition manager') } + let(:table_names) { %w[partitioning_test1 partitioning_test2] } + let(:models) do + table_names.map do |table_name| + Class.new(ApplicationRecord) do + include PartitionedTable + + self.table_name = table_name + partitioned_by :created_at, strategy: :monthly + end + end + end + + before do + table_names.each do |table_name| + connection.execute(<<~SQL) + CREATE TABLE #{table_name} ( + id serial not null, + created_at timestamptz not null, + PRIMARY KEY (id, created_at)) + PARTITION BY RANGE (created_at); + SQL + end + end + + it 'manages partitions for each given model' do + expect { described_class.sync_partitions(models)} + .to change { find_partitions(table_names.first).size }.from(0) + .and change { find_partitions(table_names.last).size }.from(0) + end context 'when no partitioned models are given' do - it 'calls the partition manager with the registered models' do - expect(partition_manager_class).to receive(:new) + let(:partition_manager_class) { described_class::PartitionManager } + let(:partition_manager) { double('partition manager') } + let(:model) { double('model') } + + it 'manages partitions for each registered model' do + expect(Gitlab::Database::EachDatabase).to receive(:each_model_connection) .with(described_class.registered_models) - .and_return(partition_manager) + .and_yield(model) + expect(partition_manager_class).to receive(:new).with(model).and_return(partition_manager) expect(partition_manager).to receive(:sync_partitions) described_class.sync_partitions end end + end - context 'when partitioned models are given' do - it 'calls the partition manager with the given models' do - models = ['my special model'] + describe '.report_metrics' do + let(:model1) { double('model') } + let(:model2) { double('model') } - expect(partition_manager_class).to receive(:new) - .with(models) - .and_return(partition_manager) + let(:partition_monitoring_class) { described_class::PartitionMonitoring } - expect(partition_manager).to receive(:sync_partitions) + context 'when no partitioned models are given' do + it 'reports metrics for each registered model' do + expect_next_instance_of(partition_monitoring_class) do |partition_monitor| + expect(partition_monitor).to receive(:report_metrics_for_model).with(model1) + expect(partition_monitor).to receive(:report_metrics_for_model).with(model2) + end + + expect(Gitlab::Database::EachDatabase).to receive(:each_model_connection) + .with(described_class.registered_models) + .and_yield(model1) + .and_yield(model2) + + described_class.report_metrics + end + end + + context 'when partitioned models are given' do + it 'reports metrics for each given model' do + expect_next_instance_of(partition_monitoring_class) do |partition_monitor| + expect(partition_monitor).to receive(:report_metrics_for_model).with(model1) + expect(partition_monitor).to receive(:report_metrics_for_model).with(model2) + end + + expect(Gitlab::Database::EachDatabase).to receive(:each_model_connection) + .with([model1, model2]) + .and_yield(model1) + .and_yield(model2) - described_class.sync_partitions(models) + described_class.report_metrics([model1, model2]) end end end describe '.drop_detached_partitions' do - let(:partition_dropper_class) { described_class::MultiDatabasePartitionDropper } + let(:table_names) { %w[detached_test_partition1 detached_test_partition2] } - it 'delegates to the partition dropper' do - expect_next_instance_of(partition_dropper_class) do |partition_dropper| - expect(partition_dropper).to receive(:drop_detached_partitions) + before do + table_names.each do |table_name| + connection.create_table("#{Gitlab::Database::DYNAMIC_PARTITIONS_SCHEMA}.#{table_name}") + + Postgresql::DetachedPartition.create!(table_name: table_name, drop_after: 1.year.ago) end + end + + it 'drops detached partitions for each database' do + expect(Gitlab::Database::EachDatabase).to receive(:each_database_connection).and_yield + + expect { described_class.drop_detached_partitions } + .to change { Postgresql::DetachedPartition.count }.from(2).to(0) + .and change { table_exists?(table_names.first) }.from(true).to(false) + .and change { table_exists?(table_names.last) }.from(true).to(false) + end - described_class.drop_detached_partitions + def table_exists?(table_name) + table_oid(table_name).present? end end diff --git a/spec/support/database/cross-database-modification-allowlist.yml b/spec/support/database/cross-database-modification-allowlist.yml index 65b44379abc..030359a9ee6 100644 --- a/spec/support/database/cross-database-modification-allowlist.yml +++ b/spec/support/database/cross-database-modification-allowlist.yml @@ -1,379 +1,18 @@ -- "./ee/spec/controllers/admin/geo/nodes_controller_spec.rb" -- "./ee/spec/controllers/admin/geo/projects_controller_spec.rb" -- "./ee/spec/controllers/admin/projects_controller_spec.rb" -- "./ee/spec/controllers/concerns/internal_redirect_spec.rb" - "./ee/spec/controllers/ee/projects/jobs_controller_spec.rb" -- "./ee/spec/controllers/oauth/geo_auth_controller_spec.rb" -- "./ee/spec/controllers/projects/approver_groups_controller_spec.rb" -- "./ee/spec/controllers/projects/approvers_controller_spec.rb" - "./ee/spec/controllers/projects/merge_requests_controller_spec.rb" -- "./ee/spec/controllers/projects/merge_requests/creations_controller_spec.rb" - "./ee/spec/controllers/projects/settings/access_tokens_controller_spec.rb" - "./ee/spec/controllers/projects/subscriptions_controller_spec.rb" -- "./ee/spec/features/account_recovery_regular_check_spec.rb" -- "./ee/spec/features/admin/admin_audit_logs_spec.rb" -- "./ee/spec/features/admin/admin_credentials_inventory_spec.rb" -- "./ee/spec/features/admin/admin_dashboard_spec.rb" -- "./ee/spec/features/admin/admin_dev_ops_report_spec.rb" -- "./ee/spec/features/admin/admin_merge_requests_approvals_spec.rb" -- "./ee/spec/features/admin/admin_reset_pipeline_minutes_spec.rb" -- "./ee/spec/features/admin/admin_sends_notification_spec.rb" -- "./ee/spec/features/admin/admin_settings_spec.rb" -- "./ee/spec/features/admin/admin_show_new_user_signups_cap_alert_spec.rb" -- "./ee/spec/features/admin/admin_users_spec.rb" -- "./ee/spec/features/admin/geo/admin_geo_nodes_spec.rb" -- "./ee/spec/features/admin/geo/admin_geo_projects_spec.rb" -- "./ee/spec/features/admin/geo/admin_geo_replication_nav_spec.rb" -- "./ee/spec/features/admin/geo/admin_geo_sidebar_spec.rb" -- "./ee/spec/features/admin/geo/admin_geo_uploads_spec.rb" -- "./ee/spec/features/admin/groups/admin_changes_plan_spec.rb" -- "./ee/spec/features/admin/licenses/admin_uploads_license_spec.rb" -- "./ee/spec/features/admin/licenses/show_user_count_threshold_spec.rb" -- "./ee/spec/features/admin/subscriptions/admin_views_subscription_spec.rb" -- "./ee/spec/features/analytics/code_analytics_spec.rb" -- "./ee/spec/features/billings/billing_plans_spec.rb" -- "./ee/spec/features/billings/extend_reactivate_trial_spec.rb" -- "./ee/spec/features/billings/qrtly_reconciliation_alert_spec.rb" -- "./ee/spec/features/boards/boards_licensed_features_spec.rb" -- "./ee/spec/features/boards/boards_spec.rb" -- "./ee/spec/features/boards/group_boards/board_deletion_spec.rb" -- "./ee/spec/features/boards/group_boards/multiple_boards_spec.rb" -- "./ee/spec/features/boards/new_issue_spec.rb" -- "./ee/spec/features/boards/scoped_issue_board_spec.rb" -- "./ee/spec/features/boards/sidebar_spec.rb" -- "./ee/spec/features/boards/swimlanes/epics_swimlanes_drag_drop_spec.rb" -- "./ee/spec/features/boards/swimlanes/epics_swimlanes_filtering_spec.rb" -- "./ee/spec/features/boards/swimlanes/epics_swimlanes_sidebar_labels_spec.rb" -- "./ee/spec/features/boards/swimlanes/epics_swimlanes_sidebar_spec.rb" -- "./ee/spec/features/boards/swimlanes/epics_swimlanes_spec.rb" -- "./ee/spec/features/boards/user_adds_lists_to_board_spec.rb" -- "./ee/spec/features/boards/user_visits_board_spec.rb" -- "./ee/spec/features/burndown_charts_spec.rb" -- "./ee/spec/features/burnup_charts_spec.rb" -- "./ee/spec/features/ci/ci_minutes_spec.rb" -- "./ee/spec/features/ci_shared_runner_warnings_spec.rb" -- "./ee/spec/features/clusters/create_agent_spec.rb" -- "./ee/spec/features/dashboards/activity_spec.rb" -- "./ee/spec/features/dashboards/groups_spec.rb" -- "./ee/spec/features/dashboards/issues_spec.rb" -- "./ee/spec/features/dashboards/merge_requests_spec.rb" -- "./ee/spec/features/dashboards/operations_spec.rb" -- "./ee/spec/features/dashboards/projects_spec.rb" -- "./ee/spec/features/dashboards/todos_spec.rb" -- "./ee/spec/features/discussion_comments/epic_quick_actions_spec.rb" -- "./ee/spec/features/discussion_comments/epic_spec.rb" -- "./ee/spec/features/epic_boards/epic_boards_sidebar_spec.rb" -- "./ee/spec/features/epic_boards/epic_boards_spec.rb" -- "./ee/spec/features/epic_boards/multiple_epic_boards_spec.rb" -- "./ee/spec/features/epic_boards/new_epic_spec.rb" -- "./ee/spec/features/epics/delete_epic_spec.rb" -- "./ee/spec/features/epics/epic_issues_spec.rb" -- "./ee/spec/features/epics/epic_labels_spec.rb" -- "./ee/spec/features/epics/epic_show_spec.rb" -- "./ee/spec/features/epics/epics_list_spec.rb" -- "./ee/spec/features/epics/filtered_search/visual_tokens_spec.rb" -- "./ee/spec/features/epics/gfm_autocomplete_spec.rb" -- "./ee/spec/features/epics/issue_promotion_spec.rb" -- "./ee/spec/features/epics/referencing_epics_spec.rb" -- "./ee/spec/features/epics/shortcuts_epic_spec.rb" -- "./ee/spec/features/epics/todo_spec.rb" -- "./ee/spec/features/epics/update_epic_spec.rb" -- "./ee/spec/features/epics/user_uses_quick_actions_spec.rb" -- "./ee/spec/features/geo_node_spec.rb" -- "./ee/spec/features/groups/analytics/ci_cd_analytics_spec.rb" -- "./ee/spec/features/groups/analytics/cycle_analytics/charts_spec.rb" - "./ee/spec/features/groups/analytics/cycle_analytics/filters_and_data_spec.rb" -- "./ee/spec/features/groups/analytics/cycle_analytics/multiple_value_streams_spec.rb" -- "./ee/spec/features/groups/audit_events_spec.rb" -- "./ee/spec/features/groups/billing_spec.rb" -- "./ee/spec/features/groups/contribution_analytics_spec.rb" -- "./ee/spec/features/groups/group_overview_spec.rb" -- "./ee/spec/features/groups/group_roadmap_spec.rb" -- "./ee/spec/features/groups/group_settings_spec.rb" -- "./ee/spec/features/groups/groups_security_credentials_spec.rb" -- "./ee/spec/features/groups/hooks/user_tests_hooks_spec.rb" -- "./ee/spec/features/groups/insights_spec.rb" -- "./ee/spec/features/groups/issues_spec.rb" -- "./ee/spec/features/groups/iterations/iterations_list_spec.rb" -- "./ee/spec/features/groups/iteration_spec.rb" -- "./ee/spec/features/groups/iterations/user_creates_iteration_in_cadence_spec.rb" -- "./ee/spec/features/groups/iterations/user_edits_iteration_cadence_spec.rb" -- "./ee/spec/features/groups/iterations/user_edits_iteration_spec.rb" -- "./ee/spec/features/groups/iterations/user_views_iteration_cadence_spec.rb" -- "./ee/spec/features/groups/iterations/user_views_iteration_spec.rb" -- "./ee/spec/features/groups/ldap_group_links_spec.rb" -- "./ee/spec/features/groups/ldap_settings_spec.rb" -- "./ee/spec/features/groups/members/leave_group_spec.rb" -- "./ee/spec/features/groups/members/list_members_spec.rb" -- "./ee/spec/features/groups/members/override_ldap_memberships_spec.rb" -- "./ee/spec/features/groups/new_spec.rb" -- "./ee/spec/features/groups/push_rules_spec.rb" -- "./ee/spec/features/groups/saml_providers_spec.rb" -- "./ee/spec/features/groups/scim_token_spec.rb" -- "./ee/spec/features/groups/seat_usage/seat_usage_spec.rb" -- "./ee/spec/features/groups/security/compliance_dashboards_spec.rb" -- "./ee/spec/features/groups/settings/user_configures_insights_spec.rb" -- "./ee/spec/features/groups/settings/user_searches_in_settings_spec.rb" -- "./ee/spec/features/groups/sso_spec.rb" -- "./ee/spec/features/groups/wikis_spec.rb" -- "./ee/spec/features/groups/wiki/user_views_wiki_empty_spec.rb" -- "./ee/spec/features/ide/user_commits_changes_spec.rb" -- "./ee/spec/features/ide/user_opens_ide_spec.rb" -- "./ee/spec/features/integrations/jira/jira_issues_list_spec.rb" -- "./ee/spec/features/issues/blocking_issues_spec.rb" -- "./ee/spec/features/issues/epic_in_issue_sidebar_spec.rb" -- "./ee/spec/features/issues/filtered_search/filter_issues_by_iteration_spec.rb" -- "./ee/spec/features/issues/filtered_search/filter_issues_epic_spec.rb" -- "./ee/spec/features/issues/filtered_search/filter_issues_weight_spec.rb" -- "./ee/spec/features/issues/form_spec.rb" -- "./ee/spec/features/issues/gfm_autocomplete_ee_spec.rb" -- "./ee/spec/features/issues/issue_actions_spec.rb" -- "./ee/spec/features/issues/issue_sidebar_spec.rb" -- "./ee/spec/features/issues/move_issue_resource_weight_events_spec.rb" -- "./ee/spec/features/issues/related_issues_spec.rb" -- "./ee/spec/features/issues/resource_weight_events_spec.rb" -- "./ee/spec/features/issues/user_bulk_edits_issues_spec.rb" -- "./ee/spec/features/issues/user_edits_issue_spec.rb" -- "./ee/spec/features/issues/user_uses_quick_actions_spec.rb" -- "./ee/spec/features/issues/user_views_issues_spec.rb" -- "./ee/spec/features/labels_hierarchy_spec.rb" -- "./ee/spec/features/markdown/metrics_spec.rb" -- "./ee/spec/features/merge_requests/user_filters_by_approvers_spec.rb" -- "./ee/spec/features/merge_requests/user_resets_approvers_spec.rb" -- "./ee/spec/features/merge_requests/user_views_all_merge_requests_spec.rb" -- "./ee/spec/features/merge_request/user_approves_with_password_spec.rb" -- "./ee/spec/features/merge_request/user_creates_merge_request_spec.rb" -- "./ee/spec/features/merge_request/user_creates_merge_request_with_blocking_mrs_spec.rb" -- "./ee/spec/features/merge_request/user_creates_multiple_assignees_mr_spec.rb" -- "./ee/spec/features/merge_request/user_creates_multiple_reviewers_mr_spec.rb" -- "./ee/spec/features/merge_request/user_edits_approval_rules_mr_spec.rb" -- "./ee/spec/features/merge_request/user_edits_merge_request_blocking_mrs_spec.rb" -- "./ee/spec/features/merge_request/user_edits_multiple_assignees_mr_spec.rb" -- "./ee/spec/features/merge_request/user_edits_multiple_reviewers_mr_spec.rb" -- "./ee/spec/features/merge_request/user_merges_immediately_spec.rb" -- "./ee/spec/features/merge_request/user_merges_with_push_rules_spec.rb" -- "./ee/spec/features/merge_request/user_sees_approval_widget_spec.rb" -- "./ee/spec/features/merge_request/user_sees_closing_issues_message_spec.rb" -- "./ee/spec/features/merge_request/user_sees_merge_widget_spec.rb" -- "./ee/spec/features/merge_request/user_sees_status_checks_widget_spec.rb" -- "./ee/spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb" -- "./ee/spec/features/merge_request/user_sets_approval_rules_spec.rb" -- "./ee/spec/features/merge_request/user_sets_approvers_spec.rb" -- "./ee/spec/features/merge_request/user_uses_slash_commands_spec.rb" -- "./ee/spec/features/merge_request/user_views_blocked_merge_request_spec.rb" -- "./ee/spec/features/merge_trains/user_adds_merge_request_to_merge_train_spec.rb" -- "./ee/spec/features/merge_trains/user_adds_to_merge_train_when_pipeline_succeeds_spec.rb" -- "./ee/spec/features/oncall_schedules/user_creates_schedule_spec.rb" -- "./ee/spec/features/operations_nav_link_spec.rb" -- "./ee/spec/features/profiles/account_spec.rb" -- "./ee/spec/features/profiles/billing_spec.rb" -- "./ee/spec/features/projects/audit_events_spec.rb" -- "./ee/spec/features/projects/cluster_agents_spec.rb" -- "./ee/spec/features/projects/custom_projects_template_spec.rb" -- "./ee/spec/features/projects/environments/environments_spec.rb" -- "./ee/spec/features/projects/feature_flags/feature_flag_issues_spec.rb" -- "./ee/spec/features/projects/feature_flags/user_creates_feature_flag_spec.rb" -- "./ee/spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb" -- "./ee/spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb" -- "./ee/spec/features/projects/insights_spec.rb" -- "./ee/spec/features/projects/integrations/user_activates_jira_spec.rb" -- "./ee/spec/features/projects/issues/user_creates_issue_spec.rb" -- "./ee/spec/features/projects/iterations/iteration_cadences_list_spec.rb" -- "./ee/spec/features/projects/iterations/iterations_list_spec.rb" -- "./ee/spec/features/projects/iterations/user_views_iteration_spec.rb" -- "./ee/spec/features/projects/jobs_spec.rb" -- "./ee/spec/features/projects/kerberos_clone_instructions_spec.rb" -- "./ee/spec/features/projects/licenses/maintainer_views_policies_spec.rb" -- "./ee/spec/features/projects/members/member_is_removed_from_project_spec.rb" -- "./ee/spec/features/projects/merge_requests/user_approves_merge_request_spec.rb" -- "./ee/spec/features/projects/merge_requests/user_edits_merge_request_spec.rb" -- "./ee/spec/features/projects/mirror_spec.rb" -- "./ee/spec/features/projects/new_project_from_template_spec.rb" -- "./ee/spec/features/projects/new_project_spec.rb" -- "./ee/spec/features/projects/path_locks_spec.rb" -- "./ee/spec/features/projects/pipelines/pipeline_spec.rb" -- "./ee/spec/features/projects/push_rules_spec.rb" -- "./ee/spec/features/projects/quality/test_case_create_spec.rb" -- "./ee/spec/features/projects/quality/test_case_list_spec.rb" -- "./ee/spec/features/projects/quality/test_case_show_spec.rb" -- "./ee/spec/features/projects/releases/user_views_release_spec.rb" -- "./ee/spec/features/projects/requirements_management/requirements_list_spec.rb" -- "./ee/spec/features/projects/security/dast_scanner_profiles_spec.rb" -- "./ee/spec/features/projects/security/dast_site_profiles_spec.rb" -- "./ee/spec/features/projects/security/user_creates_on_demand_scan_spec.rb" -- "./ee/spec/features/projects/security/user_views_security_configuration_spec.rb" -- "./ee/spec/features/projects/services/prometheus_custom_metrics_spec.rb" - "./ee/spec/features/projects/services/user_activates_github_spec.rb" -- "./ee/spec/features/projects/settings/disable_merge_trains_setting_spec.rb" -- "./ee/spec/features/projects/settings/ee/repository_mirrors_settings_spec.rb" -- "./ee/spec/features/projects/settings/ee/service_desk_setting_spec.rb" -- "./ee/spec/features/projects/settings/issues_settings_spec.rb" -- "./ee/spec/features/projects/settings/merge_request_approvals_settings_spec.rb" -- "./ee/spec/features/projects/settings/merge_requests_settings_spec.rb" -- "./ee/spec/features/projects/settings/pipeline_subscriptions_spec.rb" -- "./ee/spec/features/projects/settings/protected_environments_spec.rb" -- "./ee/spec/features/projects/settings/user_manages_merge_pipelines_spec.rb" -- "./ee/spec/features/projects/settings/user_manages_merge_trains_spec.rb" -- "./ee/spec/features/projects_spec.rb" -- "./ee/spec/features/projects/user_applies_custom_file_template_spec.rb" -- "./ee/spec/features/projects/view_blob_with_code_owners_spec.rb" -- "./ee/spec/features/projects/wiki/user_views_wiki_empty_spec.rb" -- "./ee/spec/features/promotion_spec.rb" -- "./ee/spec/features/protected_branches_spec.rb" -- "./ee/spec/features/protected_tags_spec.rb" -- "./ee/spec/features/registrations/combined_registration_spec.rb" -- "./ee/spec/features/registrations/trial_during_signup_flow_spec.rb" -- "./ee/spec/features/registrations/user_sees_new_onboarding_flow_spec.rb" -- "./ee/spec/features/registrations/welcome_spec.rb" -- "./ee/spec/features/search/elastic/global_search_spec.rb" -- "./ee/spec/features/search/elastic/group_search_spec.rb" -- "./ee/spec/features/search/elastic/project_search_spec.rb" -- "./ee/spec/features/search/elastic/snippet_search_spec.rb" -- "./ee/spec/features/search/user_searches_for_epics_spec.rb" -- "./ee/spec/features/subscriptions/groups/edit_spec.rb" -- "./ee/spec/features/trial_registrations/signup_spec.rb" -- "./ee/spec/features/trials/capture_lead_spec.rb" -- "./ee/spec/features/trials/select_namespace_spec.rb" -- "./ee/spec/features/trials/show_trial_banner_spec.rb" -- "./ee/spec/features/users/login_spec.rb" -- "./ee/spec/finders/geo/attachment_legacy_registry_finder_spec.rb" -- "./ee/spec/finders/geo/container_repository_registry_finder_spec.rb" -- "./ee/spec/finders/geo/lfs_object_registry_finder_spec.rb" -- "./ee/spec/finders/geo/merge_request_diff_registry_finder_spec.rb" -- "./ee/spec/finders/geo/package_file_registry_finder_spec.rb" -- "./ee/spec/finders/geo/pages_deployment_registry_finder_spec.rb" -- "./ee/spec/finders/geo/pipeline_artifact_registry_finder_spec.rb" -- "./ee/spec/finders/geo/project_registry_finder_spec.rb" -- "./ee/spec/finders/merge_requests/by_approvers_finder_spec.rb" - "./ee/spec/frontend/fixtures/analytics/value_streams.rb" - "./ee/spec/graphql/mutations/dast_on_demand_scans/create_spec.rb" -- "./ee/spec/graphql/mutations/dast/profiles/create_spec.rb" - "./ee/spec/graphql/mutations/dast/profiles/run_spec.rb" -- "./ee/spec/graphql/mutations/dast/profiles/update_spec.rb" - "./ee/spec/graphql/mutations/merge_requests/accept_spec.rb" -- "./ee/spec/graphql/resolvers/geo/group_wiki_repository_registries_resolver_spec.rb" -- "./ee/spec/graphql/resolvers/geo/lfs_object_registries_resolver_spec.rb" -- "./ee/spec/graphql/resolvers/geo/merge_request_diff_registries_resolver_spec.rb" -- "./ee/spec/graphql/resolvers/geo/package_file_registries_resolver_spec.rb" -- "./ee/spec/graphql/resolvers/geo/pages_deployment_registries_resolver_spec.rb" -- "./ee/spec/graphql/resolvers/geo/pipeline_artifact_registries_resolver_spec.rb" -- "./ee/spec/graphql/resolvers/geo/snippet_repository_registries_resolver_spec.rb" -- "./ee/spec/graphql/resolvers/geo/terraform_state_version_registries_resolver_spec.rb" -- "./ee/spec/graphql/resolvers/geo/upload_registries_resolver_spec.rb" -- "./ee/spec/helpers/application_helper_spec.rb" -- "./ee/spec/helpers/ee/geo_helper_spec.rb" - "./ee/spec/lib/analytics/devops_adoption/snapshot_calculator_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/backfill_iteration_cadence_id_for_boards_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/backfill_version_data_from_gitaly_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/create_security_setting_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/fix_ruby_object_in_audit_events_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_check_progress_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_in_batch_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/migrate_devops_segments_to_groups_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/migrate_security_scans_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/move_epic_issues_after_epics_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/populate_any_approval_rule_for_merge_requests_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/populate_any_approval_rule_for_projects_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/populate_latest_pipeline_ids_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/populate_namespace_statistics_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/populate_resolved_on_default_branch_column_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/populate_vulnerability_feedback_pipeline_id_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/populate_vulnerability_historical_statistics_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/prune_orphaned_geo_events_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/remove_duplicate_cs_findings_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/remove_duplicated_cs_findings_without_vulnerability_id_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/remove_inaccessible_epic_todos_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/remove_undefined_occurrence_confidence_level_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/remove_undefined_occurrence_severity_level_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/remove_undefined_vulnerability_confidence_level_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/remove_undefined_vulnerability_severity_level_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/update_location_fingerprint_for_container_scanning_findings_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/update_vulnerabilities_from_dismissal_feedback_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/update_vulnerabilities_to_dismissed_spec.rb" -- "./ee/spec/lib/ee/gitlab/background_migration/update_vulnerability_confidence_spec.rb" -- "./ee/spec/lib/ee/gitlab/database/connection_spec.rb" -- "./ee/spec/lib/ee/gitlab/database_spec.rb" -- "./ee/spec/lib/ee/gitlab/middleware/read_only_spec.rb" -- "./ee/spec/lib/ee/gitlab/usage_data_spec.rb" -- "./ee/spec/lib/gitlab/background_migration/fix_orphan_promoted_issues_spec.rb" -- "./ee/spec/lib/gitlab/background_migration/user_mentions/create_resource_user_mention_spec.rb" - "./ee/spec/lib/gitlab/ci/templates/Jobs/dast_default_branch_gitlab_ci_yaml_spec.rb" -- "./ee/spec/lib/gitlab/geo/base_request_spec.rb" -- "./ee/spec/lib/gitlab/geo/database_tasks_spec.rb" -- "./ee/spec/lib/gitlab/geo/event_gap_tracking_spec.rb" -- "./ee/spec/lib/gitlab/geo/geo_tasks_spec.rb" -- "./ee/spec/lib/gitlab/geo/jwt_request_decoder_spec.rb" -- "./ee/spec/lib/gitlab/geo/log_cursor/events/design_repository_updated_event_spec.rb" -- "./ee/spec/lib/gitlab/geo/log_cursor/events/job_artifact_deleted_event_spec.rb" -- "./ee/spec/lib/gitlab/geo/log_cursor/events/repository_created_event_spec.rb" -- "./ee/spec/lib/gitlab/geo/log_cursor/events/repository_updated_event_spec.rb" -- "./ee/spec/lib/gitlab/geo/oauth/login_state_spec.rb" -- "./ee/spec/lib/gitlab/geo/oauth/logout_token_spec.rb" -- "./ee/spec/lib/gitlab/geo/oauth/session_spec.rb" -- "./ee/spec/lib/gitlab/geo/registry_batcher_spec.rb" -- "./ee/spec/lib/gitlab/geo/replicable_model_spec.rb" -- "./ee/spec/lib/gitlab/geo/replication/blob_downloader_spec.rb" -- "./ee/spec/lib/gitlab/geo/replication/file_transfer_spec.rb" -- "./ee/spec/lib/gitlab/geo/replicator_spec.rb" -- "./ee/spec/lib/gitlab/git_access_spec.rb" -- "./ee/spec/lib/pseudonymizer/dumper_spec.rb" -- "./ee/spec/lib/system_check/geo/geo_database_configured_check_spec.rb" -- "./ee/spec/lib/system_check/geo/http_connection_check_spec.rb" -- "./ee/spec/lib/system_check/rake_task/geo_task_spec.rb" - "./ee/spec/mailers/notify_spec.rb" -- "./ee/spec/migrations/20190926180443_schedule_epic_issues_after_epics_move_spec.rb" -- "./ee/spec/migrations/add_non_null_constraint_for_escalation_rule_on_pending_alert_escalations_spec.rb" -- "./ee/spec/migrations/add_unique_constraint_to_software_licenses_spec.rb" -- "./ee/spec/migrations/backfill_namespace_statistics_with_wiki_size_spec.rb" -- "./ee/spec/migrations/backfill_operations_feature_flags_iid_spec.rb" -- "./ee/spec/migrations/backfill_software_licenses_spdx_identifiers_spec.rb" -- "./ee/spec/migrations/backfill_version_author_and_created_at_spec.rb" -- "./ee/spec/migrations/cleanup_deploy_access_levels_for_removed_groups_spec.rb" -- "./ee/spec/migrations/create_elastic_reindexing_subtasks_spec.rb" -- "./ee/spec/migrations/fix_any_approver_rule_for_projects_spec.rb" -- "./ee/spec/migrations/migrate_design_notes_mentions_to_db_spec.rb" -- "./ee/spec/migrations/migrate_epic_mentions_to_db_spec.rb" -- "./ee/spec/migrations/migrate_epic_notes_mentions_to_db_spec.rb" -- "./ee/spec/migrations/migrate_license_management_artifacts_to_license_scanning_spec.rb" -- "./ee/spec/migrations/migrate_saml_identities_to_scim_identities_spec.rb" -- "./ee/spec/migrations/migrate_scim_identities_to_saml_for_new_users_spec.rb" -- "./ee/spec/migrations/migrate_vulnerability_dismissal_feedback_spec.rb" -- "./ee/spec/migrations/migrate_vulnerability_dismissals_spec.rb" -- "./ee/spec/migrations/nullify_feature_flag_plaintext_tokens_spec.rb" -- "./ee/spec/migrations/populate_vulnerability_historical_statistics_for_year_spec.rb" -- "./ee/spec/migrations/remove_creations_in_gitlab_subscription_histories_spec.rb" -- "./ee/spec/migrations/remove_cycle_analytics_total_stage_data_spec.rb" -- "./ee/spec/migrations/remove_duplicated_cs_findings_spec.rb" -- "./ee/spec/migrations/remove_duplicated_cs_findings_without_vulnerability_id_spec.rb" -- "./ee/spec/migrations/remove_schedule_and_status_null_constraints_from_pending_escalations_alert_spec.rb" -- "./ee/spec/migrations/schedule_fix_orphan_promoted_issues_spec.rb" -- "./ee/spec/migrations/schedule_fix_ruby_object_in_audit_events_spec.rb" -- "./ee/spec/migrations/schedule_merge_request_any_approval_rule_migration_spec.rb" -- "./ee/spec/migrations/schedule_populate_dismissed_state_for_vulnerabilities_spec.rb" -- "./ee/spec/migrations/schedule_populate_resolved_on_default_branch_column_spec.rb" -- "./ee/spec/migrations/schedule_populate_vulnerability_historical_statistics_spec.rb" -- "./ee/spec/migrations/schedule_project_any_approval_rule_migration_spec.rb" -- "./ee/spec/migrations/schedule_remove_inaccessible_epic_todos_spec.rb" -- "./ee/spec/migrations/schedule_sync_blocking_issues_count_spec.rb" -- "./ee/spec/migrations/schedule_uuid_population_for_security_findings2_spec.rb" -- "./ee/spec/migrations/set_report_type_for_vulnerabilities_spec.rb" -- "./ee/spec/migrations/set_resolved_state_on_vulnerabilities_spec.rb" -- "./ee/spec/migrations/update_cs_vulnerability_confidence_column_spec.rb" -- "./ee/spec/migrations/update_gitlab_subscriptions_start_at_post_eoa_spec.rb" -- "./ee/spec/migrations/update_location_fingerprint_column_for_cs_spec.rb" -- "./ee/spec/migrations/update_occurrence_severity_column_spec.rb" -- "./ee/spec/migrations/update_undefined_confidence_from_occurrences_spec.rb" -- "./ee/spec/migrations/update_undefined_confidence_from_vulnerabilities_spec.rb" -- "./ee/spec/migrations/update_vulnerability_severity_column_spec.rb" - "./ee/spec/models/analytics/cycle_analytics/group_level_spec.rb" - "./ee/spec/models/approval_merge_request_rule_spec.rb" -- "./ee/spec/models/approval_project_rule_spec.rb" -- "./ee/spec/models/approval_state_spec.rb" -- "./ee/spec/models/approval_wrapped_code_owner_rule_spec.rb" -- "./ee/spec/models/approval_wrapped_rule_spec.rb" -- "./ee/spec/models/approver_group_spec.rb" - "./ee/spec/models/ci/bridge_spec.rb" - "./ee/spec/models/ci/build_spec.rb" - "./ee/spec/models/ci/minutes/additional_pack_spec.rb" @@ -382,64 +21,16 @@ - "./ee/spec/models/concerns/approver_migrate_hook_spec.rb" - "./ee/spec/models/dora/daily_metrics_spec.rb" - "./ee/spec/models/ee/ci/job_artifact_spec.rb" -- "./ee/spec/models/ee/ci/pipeline_artifact_spec.rb" - "./ee/spec/models/ee/ci/runner_spec.rb" -- "./ee/spec/models/ee/merge_request_diff_spec.rb" -- "./ee/spec/models/ee/pages_deployment_spec.rb" -- "./ee/spec/models/ee/terraform/state_version_spec.rb" -- "./ee/spec/models/geo/container_repository_registry_spec.rb" -- "./ee/spec/models/geo/deleted_project_spec.rb" -- "./ee/spec/models/geo/design_registry_spec.rb" -- "./ee/spec/models/geo/job_artifact_registry_spec.rb" -- "./ee/spec/models/geo_node_namespace_link_spec.rb" -- "./ee/spec/models/geo_node_spec.rb" -- "./ee/spec/models/geo_node_status_spec.rb" -- "./ee/spec/models/geo/package_file_registry_spec.rb" -- "./ee/spec/models/geo/project_registry_spec.rb" - "./ee/spec/models/group_member_spec.rb" -- "./ee/spec/models/group_wiki_repository_spec.rb" - "./ee/spec/models/merge_request_spec.rb" -- "./ee/spec/models/packages/package_file_spec.rb" - "./ee/spec/models/project_spec.rb" -- "./ee/spec/models/requirements_management/requirement_spec.rb" -- "./ee/spec/models/snippet_repository_spec.rb" -- "./ee/spec/models/upload_spec.rb" -- "./ee/spec/models/visible_approvable_spec.rb" -- "./ee/spec/policies/ci/build_policy_spec.rb" -- "./ee/spec/presenters/approval_rule_presenter_spec.rb" -- "./ee/spec/presenters/merge_request_presenter_spec.rb" -- "./ee/spec/replicators/geo/pipeline_artifact_replicator_spec.rb" -- "./ee/spec/replicators/geo/terraform_state_version_replicator_spec.rb" -- "./ee/spec/requests/api/ci/pipelines_spec.rb" -- "./ee/spec/requests/api/geo_nodes_spec.rb" -- "./ee/spec/requests/api/geo_replication_spec.rb" - "./ee/spec/requests/api/graphql/mutations/dast_on_demand_scans/create_spec.rb" - "./ee/spec/requests/api/graphql/mutations/dast/profiles/create_spec.rb" - "./ee/spec/requests/api/graphql/mutations/dast/profiles/run_spec.rb" - "./ee/spec/requests/api/graphql/mutations/dast/profiles/update_spec.rb" - "./ee/spec/requests/api/graphql/project/pipeline/dast_profile_spec.rb" -- "./ee/spec/requests/api/merge_request_approval_rules_spec.rb" -- "./ee/spec/requests/api/merge_requests_spec.rb" -- "./ee/spec/requests/api/project_approval_rules_spec.rb" -- "./ee/spec/requests/api/project_approval_settings_spec.rb" -- "./ee/spec/requests/api/project_approvals_spec.rb" -- "./ee/spec/requests/api/project_snapshots_spec.rb" -- "./ee/spec/requests/api/status_checks_spec.rb" -- "./ee/spec/requests/api/vulnerability_findings_spec.rb" -- "./ee/spec/requests/projects/merge_requests_controller_spec.rb" -- "./ee/spec/routing/admin_routing_spec.rb" -- "./ee/spec/serializers/dashboard_operations_project_entity_spec.rb" -- "./ee/spec/serializers/ee/evidences/release_entity_spec.rb" -- "./ee/spec/serializers/ee/user_serializer_spec.rb" -- "./ee/spec/serializers/evidences/evidence_entity_spec.rb" -- "./ee/spec/serializers/merge_request_widget_entity_spec.rb" -- "./ee/spec/serializers/pipeline_serializer_spec.rb" -- "./ee/spec/services/approval_rules/create_service_spec.rb" -- "./ee/spec/services/approval_rules/finalize_service_spec.rb" -- "./ee/spec/services/approval_rules/merge_request_rule_destroy_service_spec.rb" -- "./ee/spec/services/approval_rules/params_filtering_service_spec.rb" -- "./ee/spec/services/approval_rules/project_rule_destroy_service_spec.rb" -- "./ee/spec/services/approval_rules/update_service_spec.rb" +- "./ee/spec/requests/api/graphql/project/pipelines/dast_profile_spec.rb" - "./ee/spec/services/app_sec/dast/profiles/create_service_spec.rb" - "./ee/spec/services/app_sec/dast/profiles/update_service_spec.rb" - "./ee/spec/services/app_sec/dast/scans/create_service_spec.rb" @@ -450,75 +41,25 @@ - "./ee/spec/services/ci/destroy_pipeline_service_spec.rb" - "./ee/spec/services/ci/minutes/track_live_consumption_service_spec.rb" - "./ee/spec/services/ci/minutes/update_build_minutes_service_spec.rb" -- "./ee/spec/services/ci/register_job_service_spec.rb" -- "./ee/spec/services/ci/retry_build_service_spec.rb" -- "./ee/spec/services/ci/run_dast_scan_service_spec.rb" - "./ee/spec/services/ci/subscribe_bridge_service_spec.rb" - "./ee/spec/services/ci/sync_reports_to_approval_rules_service_spec.rb" - "./ee/spec/services/ci/trigger_downstream_subscription_service_spec.rb" -- "./ee/spec/services/dast_on_demand_scans/create_service_spec.rb" - "./ee/spec/services/deployments/auto_rollback_service_spec.rb" - "./ee/spec/services/ee/ci/job_artifacts/destroy_all_expired_service_spec.rb" - "./ee/spec/services/ee/ci/job_artifacts/destroy_batch_service_spec.rb" -- "./ee/spec/services/ee/integrations/test/project_service_spec.rb" -- "./ee/spec/services/ee/issuable/destroy_service_spec.rb" -- "./ee/spec/services/ee/merge_requests/refresh_service_spec.rb" -- "./ee/spec/services/ee/merge_requests/update_service_spec.rb" -- "./ee/spec/services/ee/notification_service_spec.rb" -- "./ee/spec/services/ee/post_receive_service_spec.rb" -- "./ee/spec/services/ee/releases/create_evidence_service_spec.rb" - "./ee/spec/services/ee/users/destroy_service_spec.rb" -- "./ee/spec/services/external_status_checks/create_service_spec.rb" -- "./ee/spec/services/external_status_checks/destroy_service_spec.rb" -- "./ee/spec/services/external_status_checks/update_service_spec.rb" -- "./ee/spec/services/geo/container_repository_sync_service_spec.rb" -- "./ee/spec/services/geo/hashed_storage_migrated_event_store_spec.rb" -- "./ee/spec/services/geo/hashed_storage_migration_service_spec.rb" -- "./ee/spec/services/geo/node_create_service_spec.rb" -- "./ee/spec/services/geo/node_status_request_service_spec.rb" -- "./ee/spec/services/geo/node_update_service_spec.rb" -- "./ee/spec/services/geo/project_housekeeping_service_spec.rb" -- "./ee/spec/services/geo/registry_consistency_service_spec.rb" -- "./ee/spec/services/geo/repositories_changed_event_store_spec.rb" -- "./ee/spec/services/geo/repository_updated_event_store_spec.rb" -- "./ee/spec/services/geo/repository_verification_reset_spec.rb" -- "./ee/spec/services/geo/repository_verification_secondary_service_spec.rb" -- "./ee/spec/services/merge_requests/merge_service_spec.rb" -- "./ee/spec/services/merge_requests/reset_approvals_service_spec.rb" -- "./ee/spec/services/merge_requests/sync_report_approver_approval_rules_spec.rb" - "./ee/spec/services/projects/transfer_service_spec.rb" - "./ee/spec/services/security/security_orchestration_policies/rule_schedule_service_spec.rb" -- "./ee/spec/services/todo_service_spec.rb" - "./ee/spec/services/vulnerability_feedback/create_service_spec.rb" -- "./ee/spec/services/wiki_pages/create_service_spec.rb" -- "./ee/spec/services/wiki_pages/destroy_service_spec.rb" -- "./ee/spec/services/wiki_pages/update_service_spec.rb" - "./ee/spec/support/shared_examples/fixtures/analytics_value_streams_shared_examples.rb" -- "./ee/spec/support/shared_examples/graphql/geo/geo_registries_resolver_shared_examples.rb" - "./ee/spec/support/shared_examples/graphql/mutations/dast_on_demand_scans_shared_examples.rb" - "./ee/spec/support/shared_examples/graphql/mutations/dast_on_demand_scan_with_user_abilities_shared_examples.rb" -- "./ee/spec/support/shared_examples/lib/gitlab/geo/geo_log_cursor_event_shared_examples.rb" -- "./ee/spec/support/shared_examples/lib/gitlab/geo/geo_logs_event_source_info_shared_examples.rb" - "./ee/spec/support/shared_examples/models/concerns/blob_replicator_strategy_shared_examples.rb" - "./ee/spec/support/shared_examples/models/concerns/replicable_model_shared_examples.rb" - "./ee/spec/support/shared_examples/models/concerns/verifiable_replicator_shared_examples.rb" -- "./ee/spec/support/shared_examples/policies/protected_environments_shared_examples.rb" -- "./ee/spec/support/shared_examples/requests/api/project_approval_rules_api_shared_examples.rb" - "./ee/spec/support/shared_examples/services/audit_event_logging_shared_examples.rb" - "./ee/spec/support/shared_examples/services/build_execute_shared_examples.rb" - "./ee/spec/support/shared_examples/services/dast_on_demand_scans_shared_examples.rb" -- "./ee/spec/support/shared_examples/services/geo_event_store_shared_examples.rb" -- "./ee/spec/tasks/geo_rake_spec.rb" -- "./ee/spec/tasks/gitlab/geo_rake_spec.rb" -- "./ee/spec/workers/geo/file_download_dispatch_worker_spec.rb" -- "./ee/spec/workers/geo/metrics_update_worker_spec.rb" -- "./ee/spec/workers/geo/prune_event_log_worker_spec.rb" -- "./ee/spec/workers/geo/registry_sync_worker_spec.rb" -- "./ee/spec/workers/geo/repository_cleanup_worker_spec.rb" -- "./ee/spec/workers/geo/repository_sync_worker_spec.rb" -- "./ee/spec/workers/geo/repository_verification/secondary/scheduler_worker_spec.rb" -- "./ee/spec/workers/geo/repository_verification/secondary/single_worker_spec.rb" -- "./ee/spec/workers/geo/verification_worker_spec.rb" - "./ee/spec/workers/refresh_license_compliance_checks_worker_spec.rb" - "./spec/controllers/abuse_reports_controller_spec.rb" - "./spec/controllers/admin/spam_logs_controller_spec.rb" @@ -531,653 +72,43 @@ - "./spec/controllers/projects/pipelines_controller_spec.rb" - "./spec/controllers/projects/pipelines/tests_controller_spec.rb" - "./spec/controllers/projects/settings/access_tokens_controller_spec.rb" -- "./spec/controllers/projects/tags_controller_spec.rb" -- "./spec/controllers/sent_notifications_controller_spec.rb" - "./spec/factories_spec.rb" -- "./spec/features/action_cable_logging_spec.rb" -- "./spec/features/admin/admin_abuse_reports_spec.rb" -- "./spec/features/admin/admin_appearance_spec.rb" -- "./spec/features/admin/admin_broadcast_messages_spec.rb" -- "./spec/features/admin/admin_builds_spec.rb" -- "./spec/features/admin/admin_dev_ops_report_spec.rb" -- "./spec/features/admin/admin_disables_git_access_protocol_spec.rb" -- "./spec/features/admin/admin_disables_two_factor_spec.rb" -- "./spec/features/admin/admin_groups_spec.rb" -- "./spec/features/admin/admin_hooks_spec.rb" -- "./spec/features/admin/admin_labels_spec.rb" -- "./spec/features/admin/admin_mode/login_spec.rb" -- "./spec/features/admin/admin_mode/logout_spec.rb" -- "./spec/features/admin/admin_mode_spec.rb" -- "./spec/features/admin/admin_mode/workers_spec.rb" -- "./spec/features/admin/admin_projects_spec.rb" -- "./spec/features/admin/admin_runners_spec.rb" -- "./spec/features/admin/admin_search_settings_spec.rb" -- "./spec/features/admin/admin_serverless_domains_spec.rb" -- "./spec/features/admin/admin_settings_spec.rb" -- "./spec/features/admin/admin_users_impersonation_tokens_spec.rb" -- "./spec/features/admin/admin_uses_repository_checks_spec.rb" -- "./spec/features/admin/clusters/eks_spec.rb" -- "./spec/features/admin/dashboard_spec.rb" -- "./spec/features/admin/integrations/user_activates_mattermost_slash_command_spec.rb" -- "./spec/features/admin/users/user_spec.rb" -- "./spec/features/admin/users/users_spec.rb" -- "./spec/features/alert_management/alert_details_spec.rb" -- "./spec/features/alert_management/alert_management_list_spec.rb" -- "./spec/features/alert_management_spec.rb" -- "./spec/features/alert_management/user_filters_alerts_by_status_spec.rb" -- "./spec/features/alert_management/user_searches_alerts_spec.rb" -- "./spec/features/alert_management/user_updates_alert_status_spec.rb" -- "./spec/features/alerts_settings/user_views_alerts_settings_spec.rb" -- "./spec/features/atom/dashboard_spec.rb" -- "./spec/features/boards/boards_spec.rb" -- "./spec/features/boards/focus_mode_spec.rb" -- "./spec/features/boards/issue_ordering_spec.rb" -- "./spec/features/boards/keyboard_shortcut_spec.rb" -- "./spec/features/boards/multiple_boards_spec.rb" -- "./spec/features/boards/new_issue_spec.rb" -- "./spec/features/boards/reload_boards_on_browser_back_spec.rb" -- "./spec/features/boards/sidebar_due_date_spec.rb" -- "./spec/features/boards/sidebar_labels_in_namespaces_spec.rb" -- "./spec/features/boards/sidebar_labels_spec.rb" -- "./spec/features/boards/sidebar_milestones_spec.rb" -- "./spec/features/boards/sidebar_spec.rb" -- "./spec/features/boards/user_adds_lists_to_board_spec.rb" -- "./spec/features/boards/user_visits_board_spec.rb" -- "./spec/features/broadcast_messages_spec.rb" -- "./spec/features/calendar_spec.rb" -- "./spec/features/callouts/registration_enabled_spec.rb" -- "./spec/features/clusters/cluster_detail_page_spec.rb" -- "./spec/features/clusters/cluster_health_dashboard_spec.rb" -- "./spec/features/commit_spec.rb" -- "./spec/features/commits_spec.rb" -- "./spec/features/commits/user_uses_quick_actions_spec.rb" -- "./spec/features/contextual_sidebar_spec.rb" - "./spec/features/cycle_analytics_spec.rb" -- "./spec/features/dashboard/activity_spec.rb" -- "./spec/features/dashboard/archived_projects_spec.rb" -- "./spec/features/dashboard/datetime_on_tooltips_spec.rb" -- "./spec/features/dashboard/group_dashboard_with_external_authorization_service_spec.rb" -- "./spec/features/dashboard/groups_list_spec.rb" -- "./spec/features/dashboard/group_spec.rb" -- "./spec/features/dashboard/issues_filter_spec.rb" -- "./spec/features/dashboard/issues_spec.rb" -- "./spec/features/dashboard/label_filter_spec.rb" -- "./spec/features/dashboard/merge_requests_spec.rb" -- "./spec/features/dashboard/milestones_spec.rb" -- "./spec/features/dashboard/project_member_activity_index_spec.rb" -- "./spec/features/dashboard/projects_spec.rb" -- "./spec/features/dashboard/root_spec.rb" -- "./spec/features/dashboard/shortcuts_spec.rb" -- "./spec/features/dashboard/snippets_spec.rb" -- "./spec/features/dashboard/todos/todos_filtering_spec.rb" -- "./spec/features/dashboard/todos/todos_spec.rb" -- "./spec/features/dashboard/user_filters_projects_spec.rb" -- "./spec/features/discussion_comments/commit_spec.rb" -- "./spec/features/discussion_comments/issue_spec.rb" -- "./spec/features/discussion_comments/merge_request_spec.rb" -- "./spec/features/discussion_comments/snippets_spec.rb" -- "./spec/features/error_pages_spec.rb" -- "./spec/features/error_tracking/user_filters_errors_by_status_spec.rb" -- "./spec/features/error_tracking/user_searches_sentry_errors_spec.rb" -- "./spec/features/error_tracking/user_sees_error_details_spec.rb" -- "./spec/features/error_tracking/user_sees_error_index_spec.rb" -- "./spec/features/expand_collapse_diffs_spec.rb" -- "./spec/features/explore/groups_list_spec.rb" -- "./spec/features/explore/groups_spec.rb" -- "./spec/features/explore/user_explores_projects_spec.rb" -- "./spec/features/file_uploads/attachment_spec.rb" -- "./spec/features/file_uploads/ci_artifact_spec.rb" -- "./spec/features/file_uploads/git_lfs_spec.rb" -- "./spec/features/file_uploads/graphql_add_design_spec.rb" -- "./spec/features/file_uploads/group_import_spec.rb" -- "./spec/features/file_uploads/maven_package_spec.rb" -- "./spec/features/file_uploads/multipart_invalid_uploads_spec.rb" -- "./spec/features/file_uploads/nuget_package_spec.rb" -- "./spec/features/file_uploads/project_import_spec.rb" -- "./spec/features/file_uploads/rubygem_package_spec.rb" -- "./spec/features/file_uploads/user_avatar_spec.rb" -- "./spec/features/frequently_visited_projects_and_groups_spec.rb" -- "./spec/features/gitlab_experiments_spec.rb" -- "./spec/features/global_search_spec.rb" -- "./spec/features/groups/activity_spec.rb" -- "./spec/features/groups/board_sidebar_spec.rb" -- "./spec/features/groups/board_spec.rb" -- "./spec/features/groups/clusters/eks_spec.rb" -- "./spec/features/groups/clusters/user_spec.rb" -- "./spec/features/groups/container_registry_spec.rb" -- "./spec/features/groups/dependency_proxy_spec.rb" -- "./spec/features/groups/empty_states_spec.rb" -- "./spec/features/groups/import_export/connect_instance_spec.rb" -- "./spec/features/groups/import_export/export_file_spec.rb" -- "./spec/features/groups/import_export/import_file_spec.rb" -- "./spec/features/groups/integrations/user_activates_mattermost_slash_command_spec.rb" -- "./spec/features/groups/issues_spec.rb" -- "./spec/features/groups/labels/index_spec.rb" -- "./spec/features/groups/labels/search_labels_spec.rb" -- "./spec/features/groups/labels/sort_labels_spec.rb" -- "./spec/features/groups/labels/subscription_spec.rb" -- "./spec/features/groups/members/filter_members_spec.rb" -- "./spec/features/groups/members/leave_group_spec.rb" -- "./spec/features/groups/members/list_members_spec.rb" -- "./spec/features/groups/members/manage_groups_spec.rb" -- "./spec/features/groups/members/manage_members_spec.rb" -- "./spec/features/groups/members/master_adds_member_with_expiration_date_spec.rb" -- "./spec/features/groups/members/master_manages_access_requests_spec.rb" -- "./spec/features/groups/members/search_members_spec.rb" -- "./spec/features/groups/members/sort_members_spec.rb" -- "./spec/features/groups/members/tabs_spec.rb" -- "./spec/features/groups/merge_requests_spec.rb" -- "./spec/features/groups/milestones/gfm_autocomplete_spec.rb" -- "./spec/features/groups/milestone_spec.rb" -- "./spec/features/groups/milestones_sorting_spec.rb" - "./spec/features/groups/packages_spec.rb" -- "./spec/features/groups/settings/group_badges_spec.rb" -- "./spec/features/groups/settings/packages_and_registries_spec.rb" -- "./spec/features/groups/settings/repository_spec.rb" -- "./spec/features/groups/settings/user_searches_in_settings_spec.rb" -- "./spec/features/groups/show_spec.rb" -- "./spec/features/groups_spec.rb" -- "./spec/features/groups/user_browse_projects_group_page_spec.rb" -- "./spec/features/groups/user_sees_users_dropdowns_in_issuables_list_spec.rb" -- "./spec/features/help_pages_spec.rb" -- "./spec/features/ide_spec.rb" -- "./spec/features/ide/user_commits_changes_spec.rb" -- "./spec/features/ide/user_opens_merge_request_spec.rb" -- "./spec/features/import/manifest_import_spec.rb" -- "./spec/features/incidents/incident_details_spec.rb" -- "./spec/features/incidents/incidents_list_spec.rb" -- "./spec/features/incidents/user_creates_new_incident_spec.rb" -- "./spec/features/incidents/user_filters_incidents_by_status_spec.rb" -- "./spec/features/incidents/user_searches_incidents_spec.rb" -- "./spec/features/incidents/user_views_incident_spec.rb" -- "./spec/features/issuables/issuable_list_spec.rb" -- "./spec/features/issuables/markdown_references/internal_references_spec.rb" -- "./spec/features/issuables/markdown_references/jira_spec.rb" -- "./spec/features/issuables/sorting_list_spec.rb" -- "./spec/features/issuables/user_sees_sidebar_spec.rb" -- "./spec/features/issues/create_issue_for_discussions_in_merge_request_spec.rb" -- "./spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb" -- "./spec/features/issues/csv_spec.rb" -- "./spec/features/issues/discussion_lock_spec.rb" -- "./spec/features/issues/filtered_search/dropdown_assignee_spec.rb" -- "./spec/features/issues/filtered_search/dropdown_author_spec.rb" -- "./spec/features/issues/filtered_search/dropdown_base_spec.rb" -- "./spec/features/issues/filtered_search/dropdown_emoji_spec.rb" -- "./spec/features/issues/filtered_search/dropdown_hint_spec.rb" -- "./spec/features/issues/filtered_search/dropdown_label_spec.rb" -- "./spec/features/issues/filtered_search/dropdown_milestone_spec.rb" -- "./spec/features/issues/filtered_search/dropdown_release_spec.rb" -- "./spec/features/issues/filtered_search/filter_issues_spec.rb" -- "./spec/features/issues/filtered_search/recent_searches_spec.rb" -- "./spec/features/issues/filtered_search/search_bar_spec.rb" -- "./spec/features/issues/filtered_search/visual_tokens_spec.rb" -- "./spec/features/issues/form_spec.rb" -- "./spec/features/issues/gfm_autocomplete_spec.rb" -- "./spec/features/issues/group_label_sidebar_spec.rb" -- "./spec/features/issues/incident_issue_spec.rb" - "./spec/features/issues/issue_detail_spec.rb" -- "./spec/features/issues/issue_header_spec.rb" -- "./spec/features/issues/issue_sidebar_spec.rb" -- "./spec/features/issues/keyboard_shortcut_spec.rb" -- "./spec/features/issues/markdown_toolbar_spec.rb" -- "./spec/features/issues/move_spec.rb" -- "./spec/features/issues/note_polling_spec.rb" -- "./spec/features/issues/notes_on_issues_spec.rb" -- "./spec/features/issues/related_issues_spec.rb" -- "./spec/features/issues/resource_label_events_spec.rb" -- "./spec/features/issues/service_desk_spec.rb" -- "./spec/features/issues/spam_issues_spec.rb" -- "./spec/features/issues/todo_spec.rb" -- "./spec/features/issues/user_bulk_edits_issues_labels_spec.rb" -- "./spec/features/issues/user_bulk_edits_issues_spec.rb" -- "./spec/features/issues/user_comments_on_issue_spec.rb" -- "./spec/features/issues/user_creates_branch_and_merge_request_spec.rb" -- "./spec/features/issues/user_creates_confidential_merge_request_spec.rb" -- "./spec/features/issues/user_creates_issue_by_email_spec.rb" -- "./spec/features/issues/user_creates_issue_spec.rb" -- "./spec/features/issues/user_edits_issue_spec.rb" -- "./spec/features/issues/user_filters_issues_spec.rb" -- "./spec/features/issues/user_interacts_with_awards_spec.rb" -- "./spec/features/issues/user_invites_from_a_comment_spec.rb" -- "./spec/features/issues/user_resets_their_incoming_email_token_spec.rb" -- "./spec/features/issues/user_sees_empty_state_spec.rb" -- "./spec/features/issues/user_sees_live_update_spec.rb" -- "./spec/features/issues/user_sees_sidebar_updates_in_realtime_spec.rb" -- "./spec/features/issues/user_sorts_issue_comments_spec.rb" -- "./spec/features/issues/user_sorts_issues_spec.rb" -- "./spec/features/issues/user_toggles_subscription_spec.rb" -- "./spec/features/issues/user_uses_quick_actions_spec.rb" -- "./spec/features/issues/user_views_issue_spec.rb" -- "./spec/features/issues/user_views_issues_spec.rb" -- "./spec/features/jira_connect/branches_spec.rb" -- "./spec/features/labels_hierarchy_spec.rb" -- "./spec/features/markdown/copy_as_gfm_spec.rb" -- "./spec/features/markdown/gitlab_flavored_markdown_spec.rb" -- "./spec/features/markdown/keyboard_shortcuts_spec.rb" -- "./spec/features/markdown/math_spec.rb" -- "./spec/features/markdown/mermaid_spec.rb" -- "./spec/features/markdown/metrics_spec.rb" -- "./spec/features/merge_request/batch_comments_spec.rb" -- "./spec/features/merge_request/close_reopen_report_toggle_spec.rb" -- "./spec/features/merge_request/maintainer_edits_fork_spec.rb" -- "./spec/features/merge_request/merge_request_discussion_lock_spec.rb" -- "./spec/features/merge_requests/filters_generic_behavior_spec.rb" -- "./spec/features/merge_requests/user_exports_as_csv_spec.rb" -- "./spec/features/merge_requests/user_filters_by_approvals_spec.rb" -- "./spec/features/merge_requests/user_filters_by_assignees_spec.rb" -- "./spec/features/merge_requests/user_filters_by_deployments_spec.rb" -- "./spec/features/merge_requests/user_filters_by_draft_spec.rb" -- "./spec/features/merge_requests/user_filters_by_labels_spec.rb" -- "./spec/features/merge_requests/user_filters_by_milestones_spec.rb" -- "./spec/features/merge_requests/user_filters_by_multiple_criteria_spec.rb" -- "./spec/features/merge_requests/user_filters_by_target_branch_spec.rb" -- "./spec/features/merge_requests/user_mass_updates_spec.rb" -- "./spec/features/merge_request/user_accepts_merge_request_spec.rb" -- "./spec/features/merge_request/user_allows_commits_from_memebers_who_can_merge_spec.rb" -- "./spec/features/merge_request/user_approves_spec.rb" -- "./spec/features/merge_request/user_assigns_themselves_spec.rb" -- "./spec/features/merge_request/user_awards_emoji_spec.rb" -- "./spec/features/merge_request/user_clicks_merge_request_tabs_spec.rb" -- "./spec/features/merge_request/user_comments_on_commit_spec.rb" -- "./spec/features/merge_request/user_comments_on_diff_spec.rb" -- "./spec/features/merge_request/user_comments_on_merge_request_spec.rb" -- "./spec/features/merge_request/user_creates_image_diff_notes_spec.rb" -- "./spec/features/merge_request/user_creates_merge_request_spec.rb" -- "./spec/features/merge_request/user_creates_mr_spec.rb" -- "./spec/features/merge_request/user_customizes_merge_commit_message_spec.rb" -- "./spec/features/merge_request/user_edits_assignees_sidebar_spec.rb" -- "./spec/features/merge_request/user_edits_merge_request_spec.rb" -- "./spec/features/merge_request/user_edits_mr_spec.rb" -- "./spec/features/merge_request/user_edits_reviewers_sidebar_spec.rb" -- "./spec/features/merge_request/user_expands_diff_spec.rb" -- "./spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb" -- "./spec/features/merge_request/user_invites_from_a_comment_spec.rb" -- "./spec/features/merge_request/user_jumps_to_discussion_spec.rb" -- "./spec/features/merge_request/user_locks_discussion_spec.rb" -- "./spec/features/merge_request/user_manages_subscription_spec.rb" -- "./spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb" -- "./spec/features/merge_request/user_merges_immediately_spec.rb" -- "./spec/features/merge_request/user_merges_merge_request_spec.rb" -- "./spec/features/merge_request/user_merges_only_if_pipeline_succeeds_spec.rb" -- "./spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb" -- "./spec/features/merge_request/user_posts_diff_notes_spec.rb" -- "./spec/features/merge_request/user_posts_notes_spec.rb" -- "./spec/features/merge_request/user_rebases_merge_request_spec.rb" -- "./spec/features/merge_request/user_resolves_conflicts_spec.rb" -- "./spec/features/merge_request/user_resolves_diff_notes_and_discussions_resolve_spec.rb" -- "./spec/features/merge_request/user_resolves_outdated_diff_discussions_spec.rb" -- "./spec/features/merge_request/user_resolves_wip_mr_spec.rb" -- "./spec/features/merge_request/user_reverts_merge_request_spec.rb" -- "./spec/features/merge_request/user_reviews_image_spec.rb" -- "./spec/features/merge_request/user_scrolls_to_note_on_load_spec.rb" -- "./spec/features/merge_request/user_sees_avatar_on_diff_notes_spec.rb" -- "./spec/features/merge_request/user_sees_check_out_branch_modal_spec.rb" -- "./spec/features/merge_request/user_sees_cherry_pick_modal_spec.rb" -- "./spec/features/merge_request/user_sees_closing_issues_message_spec.rb" -- "./spec/features/merge_request/user_sees_deleted_target_branch_spec.rb" - "./spec/features/merge_request/user_sees_deployment_widget_spec.rb" -- "./spec/features/merge_request/user_sees_diff_spec.rb" -- "./spec/features/merge_request/user_sees_discussions_spec.rb" -- "./spec/features/merge_request/user_sees_merge_button_depending_on_unresolved_discussions_spec.rb" -- "./spec/features/merge_request/user_sees_merge_request_pipelines_spec.rb" - "./spec/features/merge_request/user_sees_merge_widget_spec.rb" -- "./spec/features/merge_request/user_sees_mini_pipeline_graph_spec.rb" -- "./spec/features/merge_request/user_sees_mr_from_deleted_forked_project_spec.rb" -- "./spec/features/merge_request/user_sees_mr_with_deleted_source_branch_spec.rb" -- "./spec/features/merge_request/user_sees_notes_from_forked_project_spec.rb" -- "./spec/features/merge_request/user_sees_pipelines_from_forked_project_spec.rb" -- "./spec/features/merge_request/user_sees_pipelines_spec.rb" -- "./spec/features/merge_request/user_sees_suggest_pipeline_spec.rb" -- "./spec/features/merge_request/user_sees_system_notes_spec.rb" -- "./spec/features/merge_request/user_sees_versions_spec.rb" -- "./spec/features/merge_request/user_selects_branches_for_new_mr_spec.rb" -- "./spec/features/merge_request/user_squashes_merge_request_spec.rb" -- "./spec/features/merge_request/user_suggests_changes_on_diff_spec.rb" -- "./spec/features/merge_request/user_toggles_whitespace_changes_spec.rb" -- "./spec/features/merge_request/user_uses_quick_actions_spec.rb" -- "./spec/features/merge_request/user_views_auto_expanding_diff_spec.rb" -- "./spec/features/merge_request/user_views_diffs_commit_spec.rb" -- "./spec/features/merge_request/user_views_diffs_file_by_file_spec.rb" -- "./spec/features/merge_request/user_views_diffs_spec.rb" -- "./spec/features/merge_request/user_views_open_merge_request_spec.rb" -- "./spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb" -- "./spec/features/milestone_spec.rb" -- "./spec/features/milestones/user_creates_milestone_spec.rb" -- "./spec/features/milestones/user_deletes_milestone_spec.rb" -- "./spec/features/milestones/user_edits_milestone_spec.rb" -- "./spec/features/milestones/user_views_milestone_spec.rb" -- "./spec/features/milestones/user_views_milestones_spec.rb" -- "./spec/features/nav/top_nav_responsive_spec.rb" -- "./spec/features/oauth_login_spec.rb" -- "./spec/features/participants_autocomplete_spec.rb" -- "./spec/features/populate_new_pipeline_vars_with_params_spec.rb" -- "./spec/features/profiles/account_spec.rb" -- "./spec/features/profiles/active_sessions_spec.rb" -- "./spec/features/profiles/keys_spec.rb" -- "./spec/features/profiles/oauth_applications_spec.rb" -- "./spec/features/profile_spec.rb" -- "./spec/features/profiles/personal_access_tokens_spec.rb" -- "./spec/features/profiles/user_changes_notified_of_own_activity_spec.rb" -- "./spec/features/profiles/user_edit_preferences_spec.rb" -- "./spec/features/profiles/user_edit_profile_spec.rb" -- "./spec/features/profiles/user_search_settings_spec.rb" -- "./spec/features/profiles/user_visits_notifications_tab_spec.rb" -- "./spec/features/profiles/user_visits_profile_preferences_page_spec.rb" -- "./spec/features/profiles/user_visits_profile_spec.rb" -- "./spec/features/project_group_variables_spec.rb" -- "./spec/features/projects/activity/user_sees_activity_spec.rb" -- "./spec/features/projects/activity/user_sees_design_activity_spec.rb" -- "./spec/features/projects/activity/user_sees_design_comment_spec.rb" -- "./spec/features/projects/activity/user_sees_private_activity_spec.rb" -- "./spec/features/projects/artifacts/file_spec.rb" -- "./spec/features/projects/artifacts/raw_spec.rb" -- "./spec/features/projects/artifacts/user_browses_artifacts_spec.rb" -- "./spec/features/projects/badges/list_spec.rb" -- "./spec/features/projects/badges/pipeline_badge_spec.rb" -- "./spec/features/projects/blobs/balsamiq_spec.rb" -- "./spec/features/projects/blobs/blob_line_permalink_updater_spec.rb" -- "./spec/features/projects/blobs/blob_show_spec.rb" -- "./spec/features/projects/blobs/edit_spec.rb" -- "./spec/features/projects/blobs/shortcuts_blob_spec.rb" -- "./spec/features/projects/blobs/user_creates_new_blob_in_new_project_spec.rb" -- "./spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb" -- "./spec/features/projects/blobs/user_views_pipeline_editor_button_spec.rb" -- "./spec/features/projects/branches/new_branch_ref_dropdown_spec.rb" -- "./spec/features/projects/branches_spec.rb" -- "./spec/features/projects/branches/user_creates_branch_spec.rb" -- "./spec/features/projects/branches/user_deletes_branch_spec.rb" -- "./spec/features/projects/branches/user_views_branches_spec.rb" -- "./spec/features/projects/ci/editor_spec.rb" -- "./spec/features/projects/clusters/eks_spec.rb" -- "./spec/features/projects/clusters/gcp_spec.rb" -- "./spec/features/projects/clusters_spec.rb" -- "./spec/features/projects/clusters/user_spec.rb" -- "./spec/features/projects/commit/builds_spec.rb" -- "./spec/features/projects/commit/cherry_pick_spec.rb" -- "./spec/features/projects/commit/comments/user_adds_comment_spec.rb" -- "./spec/features/projects/commit/comments/user_deletes_comments_spec.rb" -- "./spec/features/projects/commit/comments/user_edits_comments_spec.rb" -- "./spec/features/projects/commit/diff_notes_spec.rb" -- "./spec/features/projects/commit/mini_pipeline_graph_spec.rb" -- "./spec/features/projects/commits/user_browses_commits_spec.rb" -- "./spec/features/projects/commit/user_comments_on_commit_spec.rb" -- "./spec/features/projects/commit/user_reverts_commit_spec.rb" -- "./spec/features/projects/commit/user_views_user_status_on_commit_spec.rb" -- "./spec/features/projects/compare_spec.rb" -- "./spec/features/projects/container_registry_spec.rb" -- "./spec/features/projects/deploy_keys_spec.rb" -- "./spec/features/projects/diffs/diff_show_spec.rb" -- "./spec/features/projects/environments/environment_metrics_spec.rb" -- "./spec/features/projects/environments/environment_spec.rb" -- "./spec/features/projects/environments/environments_spec.rb" -- "./spec/features/projects/environments_pod_logs_spec.rb" -- "./spec/features/projects/feature_flags/user_creates_feature_flag_spec.rb" -- "./spec/features/projects/feature_flags/user_deletes_feature_flag_spec.rb" -- "./spec/features/projects/feature_flags/user_sees_feature_flag_list_spec.rb" -- "./spec/features/projects/feature_flags/user_updates_feature_flag_spec.rb" -- "./spec/features/projects/feature_flag_user_lists/user_deletes_feature_flag_user_list_spec.rb" -- "./spec/features/projects/feature_flag_user_lists/user_edits_feature_flag_user_list_spec.rb" -- "./spec/features/projects/feature_flag_user_lists/user_sees_feature_flag_user_list_details_spec.rb" -- "./spec/features/projects/features_visibility_spec.rb" -- "./spec/features/projects/files/dockerfile_dropdown_spec.rb" -- "./spec/features/projects/files/edit_file_soft_wrap_spec.rb" -- "./spec/features/projects/files/files_sort_submodules_with_folders_spec.rb" -- "./spec/features/projects/files/find_file_keyboard_spec.rb" -- "./spec/features/projects/files/gitignore_dropdown_spec.rb" -- "./spec/features/projects/files/gitlab_ci_yml_dropdown_spec.rb" -- "./spec/features/projects/files/project_owner_creates_license_file_spec.rb" -- "./spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb" -- "./spec/features/projects/files/template_selector_menu_spec.rb" -- "./spec/features/projects/files/template_type_dropdown_spec.rb" -- "./spec/features/projects/files/undo_template_spec.rb" -- "./spec/features/projects/files/user_browses_a_tree_with_a_folder_containing_only_a_folder_spec.rb" -- "./spec/features/projects/files/user_browses_files_spec.rb" -- "./spec/features/projects/files/user_browses_lfs_files_spec.rb" -- "./spec/features/projects/files/user_creates_directory_spec.rb" -- "./spec/features/projects/files/user_creates_files_spec.rb" -- "./spec/features/projects/files/user_deletes_files_spec.rb" -- "./spec/features/projects/files/user_edits_files_spec.rb" -- "./spec/features/projects/files/user_find_file_spec.rb" -- "./spec/features/projects/files/user_reads_pipeline_status_spec.rb" -- "./spec/features/projects/files/user_replaces_files_spec.rb" -- "./spec/features/projects/files/user_uploads_files_spec.rb" -- "./spec/features/projects/fork_spec.rb" -- "./spec/features/projects/gfm_autocomplete_load_spec.rb" -- "./spec/features/projects/graph_spec.rb" -- "./spec/features/projects/import_export/export_file_spec.rb" -- "./spec/features/projects/import_export/import_file_spec.rb" -- "./spec/features/projects/infrastructure_registry_spec.rb" -- "./spec/features/projects/integrations/user_activates_asana_spec.rb" -- "./spec/features/projects/integrations/user_activates_assembla_spec.rb" -- "./spec/features/projects/integrations/user_activates_atlassian_bamboo_ci_spec.rb" -- "./spec/features/projects/integrations/user_activates_flowdock_spec.rb" -- "./spec/features/projects/integrations/user_activates_jira_spec.rb" -- "./spec/features/projects/integrations/user_activates_pivotaltracker_spec.rb" -- "./spec/features/projects/integrations/user_uses_inherited_settings_spec.rb" -- "./spec/features/projects/issuable_templates_spec.rb" -- "./spec/features/projects/issues/design_management/user_paginates_designs_spec.rb" -- "./spec/features/projects/issues/design_management/user_permissions_upload_spec.rb" -- "./spec/features/projects/issues/design_management/user_uploads_designs_spec.rb" -- "./spec/features/projects/issues/design_management/user_views_design_spec.rb" -- "./spec/features/projects/issues/design_management/user_views_designs_spec.rb" -- "./spec/features/projects/issues/design_management/user_views_designs_with_svg_xss_spec.rb" -- "./spec/features/projects/issues/email_participants_spec.rb" -- "./spec/features/projects/jobs/permissions_spec.rb" - "./spec/features/projects/jobs_spec.rb" -- "./spec/features/projects/jobs/user_browses_job_spec.rb" -- "./spec/features/projects/jobs/user_browses_jobs_spec.rb" -- "./spec/features/projects/labels/issues_sorted_by_priority_spec.rb" -- "./spec/features/projects/labels/search_labels_spec.rb" -- "./spec/features/projects/labels/sort_labels_spec.rb" -- "./spec/features/projects/labels/subscription_spec.rb" -- "./spec/features/projects/labels/update_prioritization_spec.rb" -- "./spec/features/projects/labels/user_removes_labels_spec.rb" -- "./spec/features/projects/members/anonymous_user_sees_members_spec.rb" -- "./spec/features/projects/members/group_member_cannot_leave_group_project_spec.rb" -- "./spec/features/projects/members/group_members_spec.rb" -- "./spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb" -- "./spec/features/projects/members/groups_with_access_list_spec.rb" -- "./spec/features/projects/members/invite_group_spec.rb" -- "./spec/features/projects/members/list_spec.rb" -- "./spec/features/projects/members/master_adds_member_with_expiration_date_spec.rb" -- "./spec/features/projects/members/master_manages_access_requests_spec.rb" -- "./spec/features/projects/members/sorting_spec.rb" -- "./spec/features/projects/members/tabs_spec.rb" -- "./spec/features/projects/members/user_requests_access_spec.rb" -- "./spec/features/projects/merge_request_button_spec.rb" -- "./spec/features/projects/milestones/gfm_autocomplete_spec.rb" -- "./spec/features/projects/milestones/milestones_sorting_spec.rb" -- "./spec/features/projects/milestones/new_spec.rb" -- "./spec/features/projects/milestones/user_interacts_with_labels_spec.rb" -- "./spec/features/projects/network_graph_spec.rb" -- "./spec/features/projects/new_project_from_template_spec.rb" -- "./spec/features/projects/new_project_spec.rb" - "./spec/features/projects/packages_spec.rb" -- "./spec/features/projects/pages/user_adds_domain_spec.rb" -- "./spec/features/projects/pages/user_edits_lets_encrypt_settings_spec.rb" -- "./spec/features/projects/pages/user_edits_settings_spec.rb" - "./spec/features/projects/pipeline_schedules_spec.rb" - "./spec/features/projects/pipelines/pipeline_spec.rb" -- "./spec/features/projects/pipelines/pipelines_spec.rb" -- "./spec/features/projects/product_analytics/graphs_spec.rb" -- "./spec/features/projects/releases/user_creates_release_spec.rb" -- "./spec/features/projects/releases/user_views_edit_release_spec.rb" -- "./spec/features/projects/releases/user_views_release_spec.rb" -- "./spec/features/projects/releases/user_views_releases_spec.rb" -- "./spec/features/projects/remote_mirror_spec.rb" -- "./spec/features/projects/serverless/functions_spec.rb" -- "./spec/features/projects/services/disable_triggers_spec.rb" -- "./spec/features/projects/services/prometheus_external_alerts_spec.rb" -- "./spec/features/projects/services/user_activates_emails_on_push_spec.rb" -- "./spec/features/projects/services/user_activates_irker_spec.rb" -- "./spec/features/projects/services/user_activates_issue_tracker_spec.rb" -- "./spec/features/projects/services/user_activates_jetbrains_teamcity_ci_spec.rb" -- "./spec/features/projects/services/user_activates_mattermost_slash_command_spec.rb" -- "./spec/features/projects/services/user_activates_packagist_spec.rb" -- "./spec/features/projects/services/user_activates_prometheus_spec.rb" -- "./spec/features/projects/services/user_activates_pushover_spec.rb" -- "./spec/features/projects/services/user_activates_slack_notifications_spec.rb" -- "./spec/features/projects/services/user_activates_slack_slash_command_spec.rb" -- "./spec/features/projects/services/user_views_services_spec.rb" -- "./spec/features/projects/settings/access_tokens_spec.rb" -- "./spec/features/projects/settings/lfs_settings_spec.rb" -- "./spec/features/projects/settings/monitor_settings_spec.rb" -- "./spec/features/projects/settings/packages_settings_spec.rb" -- "./spec/features/projects/settings/project_badges_spec.rb" -- "./spec/features/projects/settings/project_settings_spec.rb" -- "./spec/features/projects/settings/registry_settings_spec.rb" -- "./spec/features/projects/settings/repository_settings_spec.rb" -- "./spec/features/projects/settings/service_desk_setting_spec.rb" -- "./spec/features/projects/settings/user_changes_default_branch_spec.rb" -- "./spec/features/projects/settings/user_interacts_with_deploy_keys_spec.rb" -- "./spec/features/projects/settings/user_manages_merge_requests_settings_spec.rb" -- "./spec/features/projects/settings/user_manages_project_members_spec.rb" -- "./spec/features/projects/settings/user_searches_in_settings_spec.rb" -- "./spec/features/projects/settings/user_sees_revoke_deploy_token_modal_spec.rb" -- "./spec/features/projects/settings/user_tags_project_spec.rb" -- "./spec/features/projects/settings/user_transfers_a_project_spec.rb" -- "./spec/features/projects/settings/visibility_settings_spec.rb" -- "./spec/features/projects/settings/webhooks_settings_spec.rb" -- "./spec/features/projects/show/schema_markup_spec.rb" -- "./spec/features/projects/show/user_interacts_with_auto_devops_banner_spec.rb" -- "./spec/features/projects/show/user_interacts_with_stars_spec.rb" -- "./spec/features/projects/show/user_manages_notifications_spec.rb" -- "./spec/features/projects/show/user_sees_collaboration_links_spec.rb" -- "./spec/features/projects/show/user_sees_last_commit_ci_status_spec.rb" -- "./spec/features/projects/show/user_sees_readme_spec.rb" -- "./spec/features/projects/show/user_uploads_files_spec.rb" -- "./spec/features/projects/snippets/create_snippet_spec.rb" -- "./spec/features/projects/snippets/show_spec.rb" -- "./spec/features/projects/snippets/user_comments_on_snippet_spec.rb" -- "./spec/features/projects/snippets/user_deletes_snippet_spec.rb" -- "./spec/features/projects/snippets/user_updates_snippet_spec.rb" -- "./spec/features/projects_spec.rb" -- "./spec/features/projects/sub_group_issuables_spec.rb" -- "./spec/features/projects/tags/user_edits_tags_spec.rb" -- "./spec/features/projects/terraform_spec.rb" -- "./spec/features/projects/tree/create_directory_spec.rb" -- "./spec/features/projects/tree/create_file_spec.rb" -- "./spec/features/projects/tree/tree_show_spec.rb" -- "./spec/features/projects/tree/upload_file_spec.rb" -- "./spec/features/projects/user_changes_project_visibility_spec.rb" -- "./spec/features/projects/user_creates_project_spec.rb" -- "./spec/features/projects/user_sees_sidebar_spec.rb" -- "./spec/features/projects/user_sees_user_popover_spec.rb" -- "./spec/features/projects/user_uses_shortcuts_spec.rb" -- "./spec/features/projects/user_views_empty_project_spec.rb" -- "./spec/features/projects/view_on_env_spec.rb" -- "./spec/features/projects/wikis_spec.rb" -- "./spec/features/projects/wiki/user_views_wiki_empty_spec.rb" -- "./spec/features/project_variables_spec.rb" -- "./spec/features/promotion_spec.rb" -- "./spec/features/protected_branches_spec.rb" -- "./spec/features/protected_tags_spec.rb" -- "./spec/features/reportable_note/commit_spec.rb" -- "./spec/features/reportable_note/issue_spec.rb" -- "./spec/features/reportable_note/merge_request_spec.rb" -- "./spec/features/reportable_note/snippets_spec.rb" -- "./spec/features/runners_spec.rb" -- "./spec/features/search/user_searches_for_code_spec.rb" -- "./spec/features/search/user_searches_for_commits_spec.rb" -- "./spec/features/search/user_searches_for_issues_spec.rb" -- "./spec/features/search/user_searches_for_merge_requests_spec.rb" -- "./spec/features/search/user_searches_for_milestones_spec.rb" -- "./spec/features/search/user_searches_for_projects_spec.rb" -- "./spec/features/search/user_searches_for_users_spec.rb" -- "./spec/features/search/user_searches_for_wiki_pages_spec.rb" -- "./spec/features/search/user_uses_header_search_field_spec.rb" -- "./spec/features/search/user_uses_search_filters_spec.rb" - "./spec/features/signed_commits_spec.rb" -- "./spec/features/snippets/embedded_snippet_spec.rb" -- "./spec/features/snippets/internal_snippet_spec.rb" -- "./spec/features/snippets/notes_on_personal_snippets_spec.rb" -- "./spec/features/snippets/private_snippets_spec.rb" -- "./spec/features/snippets/public_snippets_spec.rb" -- "./spec/features/snippets/show_spec.rb" -- "./spec/features/snippets/user_creates_snippet_spec.rb" -- "./spec/features/snippets/user_deletes_snippet_spec.rb" -- "./spec/features/snippets/user_edits_snippet_spec.rb" -- "./spec/features/tags/developer_creates_tag_spec.rb" -- "./spec/features/tags/developer_deletes_tag_spec.rb" -- "./spec/features/tags/developer_updates_tag_spec.rb" -- "./spec/features/task_lists_spec.rb" -- "./spec/features/triggers_spec.rb" -- "./spec/features/u2f_spec.rb" -- "./spec/features/uploads/user_uploads_avatar_to_profile_spec.rb" -- "./spec/features/uploads/user_uploads_file_to_note_spec.rb" -- "./spec/features/user_can_display_performance_bar_spec.rb" -- "./spec/features/user_opens_link_to_comment_spec.rb" -- "./spec/features/user_sees_revert_modal_spec.rb" -- "./spec/features/users/login_spec.rb" -- "./spec/features/users/logout_spec.rb" -- "./spec/features/users/overview_spec.rb" -- "./spec/features/users/signup_spec.rb" -- "./spec/features/users/snippets_spec.rb" -- "./spec/features/users/terms_spec.rb" -- "./spec/features/users/user_browses_projects_on_user_page_spec.rb" -- "./spec/features/webauthn_spec.rb" -- "./spec/features/whats_new_spec.rb" - "./spec/finders/ci/pipeline_schedules_finder_spec.rb" - "./spec/finders/ci/pipelines_finder_spec.rb" -- "./spec/finders/ci/pipelines_for_merge_request_finder_spec.rb" -- "./spec/finders/projects_finder_spec.rb" -- "./spec/finders/releases/evidence_pipeline_finder_spec.rb" - "./spec/frontend/fixtures/analytics.rb" -- "./spec/frontend/fixtures/jobs.rb" - "./spec/frontend/fixtures/pipeline_schedules.rb" - "./spec/frontend/fixtures/pipelines.rb" -- "./spec/graphql/mutations/design_management/upload_spec.rb" - "./spec/graphql/mutations/merge_requests/accept_spec.rb" - "./spec/graphql/resolvers/ci/test_report_summary_resolver_spec.rb" - "./spec/helpers/issuables_helper_spec.rb" -- "./spec/initializers/active_record_locking_spec.rb" -- "./spec/initializers/database_config_spec.rb" - "./spec/lib/gitlab/auth_spec.rb" -- "./spec/lib/gitlab/ci/badge/pipeline/status_spec.rb" -- "./spec/lib/gitlab/ci/build/policy/changes_spec.rb" -- "./spec/lib/gitlab/ci/charts_spec.rb" - "./spec/lib/gitlab/ci/config_spec.rb" - "./spec/lib/gitlab/ci/pipeline/chain/create_spec.rb" - "./spec/lib/gitlab/ci/pipeline/chain/seed_block_spec.rb" - "./spec/lib/gitlab/ci/pipeline/seed/build_spec.rb" -- "./spec/lib/gitlab/ci/pipeline/seed/stage_spec.rb" -- "./spec/lib/gitlab/ci/status/stage/common_spec.rb" -- "./spec/lib/gitlab/ci/status/stage/factory_spec.rb" -- "./spec/lib/gitlab/ci/status/stage/play_manual_spec.rb" - "./spec/lib/gitlab/ci/templates/5_minute_production_app_ci_yaml_spec.rb" - "./spec/lib/gitlab/ci/templates/auto_devops_gitlab_ci_yaml_spec.rb" - "./spec/lib/gitlab/ci/templates/AWS/deploy_ecs_gitlab_ci_yaml_spec.rb" - "./spec/lib/gitlab/ci/templates/Jobs/deploy_gitlab_ci_yaml_spec.rb" - "./spec/lib/gitlab/ci/templates/managed_cluster_applications_gitlab_ci_yaml_spec.rb" -- "./spec/lib/gitlab/database/bulk_update_spec.rb" -- "./spec/lib/gitlab/database/connection_spec.rb" -- "./spec/lib/gitlab/database/load_balancing/host_spec.rb" -- "./spec/lib/gitlab/database/load_balancing_spec.rb" -- "./spec/lib/gitlab/database/postgresql_adapter/force_disconnectable_mixin_spec.rb" -- "./spec/lib/gitlab/database/postgresql_adapter/type_map_cache_spec.rb" -- "./spec/lib/gitlab/database/schema_migrations/context_spec.rb" -- "./spec/lib/gitlab/database/with_lock_retries_outside_transaction_spec.rb" -- "./spec/lib/gitlab/database/with_lock_retries_spec.rb" - "./spec/lib/gitlab/data_builder/pipeline_spec.rb" -- "./spec/lib/gitlab/email/handler/create_issue_handler_spec.rb" -- "./spec/lib/gitlab/email/handler/create_merge_request_handler_spec.rb" -- "./spec/lib/gitlab/email/handler/create_note_handler_spec.rb" -- "./spec/lib/gitlab/email/handler/create_note_on_issuable_handler_spec.rb" -- "./spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb" - "./spec/lib/gitlab/usage_data_spec.rb" - "./spec/lib/peek/views/active_record_spec.rb" - "./spec/mailers/emails/pipelines_spec.rb" -- "./spec/migrations/20210205174154_remove_bad_dependency_proxy_manifests_spec.rb" -- "./spec/migrations/20210722150102_operations_feature_flags_correct_flexible_rollout_values_spec.rb" -- "./spec/migrations/backfill_escalation_policies_for_oncall_schedules_spec.rb" -- "./spec/migrations/insert_ci_daily_pipeline_schedule_triggers_plan_limits_spec.rb" -- "./spec/migrations/remove_duplicate_dast_site_tokens_with_same_token_spec.rb" - "./spec/models/ci/bridge_spec.rb" - "./spec/models/ci/build_need_spec.rb" - "./spec/models/ci/build_spec.rb" - "./spec/models/ci/build_trace_chunk_spec.rb" -- "./spec/models/ci/commit_with_pipeline_spec.rb" -- "./spec/models/ci/group_spec.rb" - "./spec/models/ci/group_variable_spec.rb" - "./spec/models/ci/instance_variable_spec.rb" - "./spec/models/ci/job_artifact_spec.rb" @@ -1185,40 +116,26 @@ - "./spec/models/ci/legacy_stage_spec.rb" - "./spec/models/ci/pipeline_schedule_spec.rb" - "./spec/models/ci/pipeline_spec.rb" -- "./spec/models/ci/runner_namespace_spec.rb" -- "./spec/models/ci/runner_project_spec.rb" - "./spec/models/ci/runner_spec.rb" - "./spec/models/ci/running_build_spec.rb" -- "./spec/models/ci/stage_spec.rb" - "./spec/models/ci/variable_spec.rb" -- "./spec/models/clusters/applications/jupyter_spec.rb" - "./spec/models/clusters/applications/runner_spec.rb" -- "./spec/models/commit_collection_spec.rb" - "./spec/models/commit_status_spec.rb" - "./spec/models/concerns/batch_destroy_dependent_associations_spec.rb" - "./spec/models/concerns/bulk_insertable_associations_spec.rb" -- "./spec/models/concerns/cron_schedulable_spec.rb" - "./spec/models/concerns/has_environment_scope_spec.rb" - "./spec/models/concerns/schedulable_spec.rb" - "./spec/models/concerns/token_authenticatable_spec.rb" - "./spec/models/design_management/version_spec.rb" - "./spec/models/environment_status_spec.rb" - "./spec/models/hooks/system_hook_spec.rb" -- "./spec/models/issue_spec.rb" - "./spec/models/members/project_member_spec.rb" - "./spec/models/merge_request_spec.rb" -- "./spec/models/plan_spec.rb" -- "./spec/models/project_feature_usage_spec.rb" - "./spec/models/project_spec.rb" - "./spec/models/spam_log_spec.rb" - "./spec/models/user_spec.rb" - "./spec/models/user_status_spec.rb" -- "./spec/policies/ci/build_policy_spec.rb" -- "./spec/policies/ci/pipeline_policy_spec.rb" -- "./spec/presenters/ci/stage_presenter_spec.rb" - "./spec/requests/api/admin/ci/variables_spec.rb" -- "./spec/requests/api/admin/plan_limits_spec.rb" -- "./spec/requests/api/ci/jobs_spec.rb" - "./spec/requests/api/ci/pipeline_schedules_spec.rb" - "./spec/requests/api/ci/pipelines_spec.rb" - "./spec/requests/api/ci/runner/runners_post_spec.rb" @@ -1227,26 +144,13 @@ - "./spec/requests/api/commit_statuses_spec.rb" - "./spec/requests/api/graphql/ci/runner_spec.rb" - "./spec/requests/api/graphql/mutations/ci/pipeline_destroy_spec.rb" -- "./spec/requests/api/graphql/project/issues_spec.rb" -- "./spec/requests/api/graphql/project/merge_request_spec.rb" -- "./spec/requests/api/graphql/project_query_spec.rb" -- "./spec/requests/api/issues/issues_spec.rb" - "./spec/requests/api/merge_requests_spec.rb" -- "./spec/requests/api/projects_spec.rb" - "./spec/requests/api/resource_access_tokens_spec.rb" - "./spec/requests/api/users_spec.rb" -- "./spec/requests/lfs_http_spec.rb" - "./spec/requests/projects/cycle_analytics_events_spec.rb" - "./spec/serializers/ci/downloadable_artifact_entity_spec.rb" - "./spec/serializers/ci/downloadable_artifact_serializer_spec.rb" -- "./spec/serializers/ci/pipeline_entity_spec.rb" -- "./spec/serializers/merge_request_poll_cached_widget_entity_spec.rb" -- "./spec/serializers/merge_request_poll_widget_entity_spec.rb" - "./spec/serializers/merge_request_widget_entity_spec.rb" -- "./spec/serializers/pipeline_details_entity_spec.rb" -- "./spec/serializers/pipeline_serializer_spec.rb" -- "./spec/serializers/stage_entity_spec.rb" -- "./spec/serializers/stage_serializer_spec.rb" - "./spec/serializers/test_report_entity_spec.rb" - "./spec/serializers/test_report_summary_entity_spec.rb" - "./spec/serializers/test_suite_entity_spec.rb" @@ -1270,39 +174,23 @@ - "./spec/services/ci/pipeline_artifacts/coverage_report_service_spec.rb" - "./spec/services/ci/pipeline_artifacts/create_code_quality_mr_diff_report_service_spec.rb" - "./spec/services/ci/pipeline_bridge_status_service_spec.rb" -- "./spec/services/ci/pipeline_processing/shared_processing_service.rb" - "./spec/services/ci/pipelines/add_job_service_spec.rb" - "./spec/services/ci/pipeline_schedule_service_spec.rb" -- "./spec/services/ci/pipeline_trigger_service_spec.rb" -- "./spec/services/ci/register_job_service_spec.rb" - "./spec/services/ci/retry_build_service_spec.rb" -- "./spec/services/ci/test_failure_history_service_spec.rb" - "./spec/services/ci/update_instance_variables_service_spec.rb" - "./spec/services/deployments/update_environment_service_spec.rb" -- "./spec/services/design_management/save_designs_service_spec.rb" - "./spec/services/environments/stop_service_spec.rb" - "./spec/services/groups/transfer_service_spec.rb" -- "./spec/services/integrations/test/project_service_spec.rb" -- "./spec/services/issuable/destroy_service_spec.rb" -- "./spec/services/issue_links/list_service_spec.rb" - "./spec/services/merge_requests/add_todo_when_build_fails_service_spec.rb" -- "./spec/services/merge_requests/mergeability_check_service_spec.rb" - "./spec/services/merge_requests/post_merge_service_spec.rb" -- "./spec/services/merge_requests/refresh_service_spec.rb" -- "./spec/services/pages/migrate_from_legacy_storage_service_spec.rb" - "./spec/services/projects/destroy_service_spec.rb" +- "./spec/services/projects/overwrite_project_service_spec.rb" - "./spec/services/projects/transfer_service_spec.rb" -- "./spec/services/projects/update_service_spec.rb" -- "./spec/services/releases/create_service_spec.rb" - "./spec/services/resource_access_tokens/revoke_service_spec.rb" -- "./spec/services/todo_service_spec.rb" -- "./spec/services/users/activity_service_spec.rb" - "./spec/services/users/destroy_service_spec.rb" - "./spec/services/users/reject_service_spec.rb" - "./spec/support/shared_contexts/email_shared_context.rb" - "./spec/support/shared_examples/controllers/access_tokens_controller_shared_examples.rb" -- "./spec/support/shared_examples/features/master_manages_access_requests_shared_example.rb" -- "./spec/support/shared_examples/integrations/test_examples.rb" - "./spec/support/shared_examples/models/atomic_internal_id_shared_examples.rb" - "./spec/support/shared_examples/models/cluster_application_status_shared_examples.rb" - "./spec/support/shared_examples/models/cluster_application_version_shared_examples.rb" @@ -1312,31 +200,14 @@ - "./spec/support/shared_examples/models/update_project_statistics_shared_examples.rb" - "./spec/support/shared_examples/models/with_uploads_shared_examples.rb" - "./spec/support/shared_examples/requests/api/status_shared_examples.rb" -- "./spec/support/shared_examples/requests/lfs_http_shared_examples.rb" -- "./spec/support/shared_examples/services/destroy_label_links_shared_examples.rb" -- "./spec/support/shared_examples/services/issuable/destroy_service_shared_examples.rb" -- "./spec/support/shared_examples/services/notification_service_shared_examples.rb" -- "./spec/support/shared_examples/services/wiki_pages/create_service_shared_examples.rb" -- "./spec/support/shared_examples/services/wiki_pages/destroy_service_shared_examples.rb" -- "./spec/support/shared_examples/services/wiki_pages/update_service_shared_examples.rb" - "./spec/support/shared_examples/workers/idempotency_shared_examples.rb" - "./spec/views/projects/artifacts/_artifact.html.haml_spec.rb" -- "./spec/views/projects/commits/_commit.html.haml_spec.rb" -- "./spec/views/projects/jobs/_build.html.haml_spec.rb" -- "./spec/views/projects/jobs/_generic_commit_status.html.haml_spec.rb" -- "./spec/views/projects/merge_requests/creations/_new_submit.html.haml_spec.rb" - "./spec/views/projects/pipeline_schedules/_pipeline_schedule.html.haml_spec.rb" - "./spec/views/shared/runners/_runner_details.html.haml_spec.rb" -- "./spec/workers/authorized_project_update/user_refresh_from_replica_worker_spec.rb" - "./spec/workers/ci/pipeline_artifacts/create_quality_report_worker_spec.rb" -- "./spec/workers/container_expiration_policy_worker_spec.rb" - "./spec/workers/merge_requests/create_pipeline_worker_spec.rb" -- "./spec/workers/pipeline_metrics_worker_spec.rb" - "./spec/workers/pipeline_schedule_worker_spec.rb" -- "./spec/workers/releases/create_evidence_worker_spec.rb" - "./spec/workers/remove_expired_members_worker_spec.rb" - "./spec/workers/repository_cleanup_worker_spec.rb" - "./spec/workers/stage_update_worker_spec.rb" - "./spec/workers/stuck_merge_jobs_worker_spec.rb" -- "./ee/spec/requests/api/graphql/project/pipelines/dast_profile_spec.rb" -- "./spec/services/projects/overwrite_project_service_spec.rb" diff --git a/spec/support/database/cross-join-allowlist.yml b/spec/support/database/cross-join-allowlist.yml index 2dbe3fc55e4..65b5f9cf1e6 100644 --- a/spec/support/database/cross-join-allowlist.yml +++ b/spec/support/database/cross-join-allowlist.yml @@ -30,6 +30,7 @@ - "./spec/lib/gitlab/background_migration/migrate_pages_metadata_spec.rb" - "./spec/migrations/20210907211557_finalize_ci_builds_bigint_conversion_spec.rb" - "./spec/migrations/associate_existing_dast_builds_with_variables_spec.rb" +- "./spec/migrations/disable_job_token_scope_when_unused_spec.rb" - "./spec/migrations/schedule_copy_ci_builds_columns_to_security_scans2_spec.rb" - "./spec/migrations/schedule_pages_metadata_migration_spec.rb" - "./spec/models/ci/pipeline_spec.rb" diff --git a/spec/support/database/gitlab_schema.rb b/spec/support/database/gitlab_schema.rb index fe05fb998e6..22f997e70e1 100644 --- a/spec/support/database/gitlab_schema.rb +++ b/spec/support/database/gitlab_schema.rb @@ -9,17 +9,12 @@ module Database end def self.table_schema(name) - tables_to_schema[name] || :undefined + # When undefined it's best to return a unique name so that we don't incorrectly assume that 2 undefined schemas belong on the same database + tables_to_schema[name] || :"undefined_#{name}" end def self.tables_to_schema - @tables_to_schema ||= all_classes_with_schema.to_h do |klass| - [klass.table_name, klass.gitlab_schema] - end - end - - def self.all_classes_with_schema - ActiveRecord::Base.descendants.reject(&:abstract_class?).select(&:gitlab_schema?) # rubocop:disable Database/MultipleDatabases + @tables_to_schema ||= YAML.load_file(Rails.root.join('spec/support/database/gitlab_schemas.yml')) end end end diff --git a/spec/support/database/gitlab_schemas.yml b/spec/support/database/gitlab_schemas.yml new file mode 100644 index 00000000000..c4fee55e071 --- /dev/null +++ b/spec/support/database/gitlab_schemas.yml @@ -0,0 +1,536 @@ +abuse_reports: :gitlab_main +agent_group_authorizations: :gitlab_main +agent_project_authorizations: :gitlab_main +alert_management_alert_assignees: :gitlab_main +alert_management_alerts: :gitlab_main +alert_management_alert_user_mentions: :gitlab_main +alert_management_http_integrations: :gitlab_main +allowed_email_domains: :gitlab_main +analytics_cycle_analytics_group_stages: :gitlab_main +analytics_cycle_analytics_group_value_streams: :gitlab_main +analytics_cycle_analytics_issue_stage_events: :gitlab_main +analytics_cycle_analytics_merge_request_stage_events: :gitlab_main +analytics_cycle_analytics_project_stages: :gitlab_main +analytics_cycle_analytics_project_value_streams: :gitlab_main +analytics_cycle_analytics_stage_event_hashes: :gitlab_main +analytics_devops_adoption_segments: :gitlab_main +analytics_devops_adoption_snapshots: :gitlab_main +analytics_language_trend_repository_languages: :gitlab_main +analytics_usage_trends_measurements: :gitlab_main +appearances: :gitlab_main +application_settings: :gitlab_main +application_setting_terms: :gitlab_main +approval_merge_request_rules_approved_approvers: :gitlab_main +approval_merge_request_rules: :gitlab_main +approval_merge_request_rules_groups: :gitlab_main +approval_merge_request_rule_sources: :gitlab_main +approval_merge_request_rules_users: :gitlab_main +approval_project_rules: :gitlab_main +approval_project_rules_groups: :gitlab_main +approval_project_rules_protected_branches: :gitlab_main +approval_project_rules_users: :gitlab_main +approvals: :gitlab_main +approver_groups: :gitlab_main +approvers: :gitlab_main +atlassian_identities: :gitlab_main +audit_events_external_audit_event_destinations: :gitlab_main +audit_events: :gitlab_main +authentication_events: :gitlab_main +award_emoji: :gitlab_main +aws_roles: :gitlab_main +background_migration_jobs: :gitlab_main +badges: :gitlab_main +banned_users: :gitlab_main +batched_background_migration_jobs: :gitlab_main +batched_background_migrations: :gitlab_main +board_assignees: :gitlab_main +board_group_recent_visits: :gitlab_main +board_labels: :gitlab_main +board_project_recent_visits: :gitlab_main +boards_epic_board_labels: :gitlab_main +boards_epic_board_positions: :gitlab_main +boards_epic_board_recent_visits: :gitlab_main +boards_epic_boards: :gitlab_main +boards_epic_lists: :gitlab_main +boards_epic_list_user_preferences: :gitlab_main +boards_epic_user_preferences: :gitlab_main +boards: :gitlab_main +board_user_preferences: :gitlab_main +broadcast_messages: :gitlab_main +bulk_import_configurations: :gitlab_main +bulk_import_entities: :gitlab_main +bulk_import_exports: :gitlab_main +bulk_import_export_uploads: :gitlab_main +bulk_import_failures: :gitlab_main +bulk_imports: :gitlab_main +bulk_import_trackers: :gitlab_main +chat_names: :gitlab_main +chat_teams: :gitlab_main +ci_build_needs: :gitlab_ci +ci_build_pending_states: :gitlab_ci +ci_build_report_results: :gitlab_ci +ci_builds: :gitlab_ci +ci_builds_metadata: :gitlab_ci +ci_builds_runner_session: :gitlab_ci +ci_build_trace_chunks: :gitlab_ci +ci_build_trace_metadata: :gitlab_ci +ci_daily_build_group_report_results: :gitlab_ci +ci_deleted_objects: :gitlab_ci +ci_freeze_periods: :gitlab_ci +ci_group_variables: :gitlab_ci +ci_instance_variables: :gitlab_ci +ci_job_artifacts: :gitlab_ci +ci_job_token_project_scope_links: :gitlab_ci +ci_job_variables: :gitlab_ci +ci_minutes_additional_packs: :gitlab_ci +ci_namespace_monthly_usages: :gitlab_ci +ci_pending_builds: :gitlab_ci +ci_pipeline_artifacts: :gitlab_ci +ci_pipeline_chat_data: :gitlab_ci +ci_pipeline_messages: :gitlab_ci +ci_pipeline_schedules: :gitlab_ci +ci_pipeline_schedule_variables: :gitlab_ci +ci_pipelines_config: :gitlab_ci +ci_pipelines: :gitlab_ci +ci_pipeline_variables: :gitlab_ci +ci_platform_metrics: :gitlab_ci +ci_project_monthly_usages: :gitlab_ci +ci_refs: :gitlab_ci +ci_resource_groups: :gitlab_ci +ci_resources: :gitlab_ci +ci_runner_namespaces: :gitlab_ci +ci_runner_projects: :gitlab_ci +ci_runners: :gitlab_ci +ci_running_builds: :gitlab_ci +ci_sources_pipelines: :gitlab_ci +ci_sources_projects: :gitlab_ci +ci_stages: :gitlab_ci +ci_subscriptions_projects: :gitlab_ci +ci_trigger_requests: :gitlab_ci +ci_triggers: :gitlab_ci +ci_unit_test_failures: :gitlab_ci +ci_unit_tests: :gitlab_ci +ci_variables: :gitlab_ci +cluster_agents: :gitlab_main +cluster_agent_tokens: :gitlab_main +cluster_groups: :gitlab_main +cluster_platforms_kubernetes: :gitlab_main +cluster_projects: :gitlab_main +cluster_providers_aws: :gitlab_main +cluster_providers_gcp: :gitlab_main +clusters_applications_cert_managers: :gitlab_main +clusters_applications_cilium: :gitlab_main +clusters_applications_crossplane: :gitlab_main +clusters_applications_elastic_stacks: :gitlab_main +clusters_applications_helm: :gitlab_main +clusters_applications_ingress: :gitlab_main +clusters_applications_jupyter: :gitlab_main +clusters_applications_knative: :gitlab_main +clusters_applications_prometheus: :gitlab_main +clusters_applications_runners: :gitlab_main +clusters: :gitlab_main +clusters_integration_elasticstack: :gitlab_main +clusters_integration_prometheus: :gitlab_main +clusters_kubernetes_namespaces: :gitlab_main +commit_user_mentions: :gitlab_main +compliance_management_frameworks: :gitlab_main +container_expiration_policies: :gitlab_main +container_repositories: :gitlab_main +conversational_development_index_metrics: :gitlab_main +coverage_fuzzing_corpuses: :gitlab_main +csv_issue_imports: :gitlab_main +custom_emoji: :gitlab_main +customer_relations_contacts: :gitlab_main +customer_relations_organizations: :gitlab_main +dast_profile_schedules: :gitlab_main +dast_profiles: :gitlab_main +dast_profiles_pipelines: :gitlab_main +dast_scanner_profiles_builds: :gitlab_main +dast_scanner_profiles: :gitlab_main +dast_site_profiles_builds: :gitlab_main +dast_site_profile_secret_variables: :gitlab_main +dast_site_profiles: :gitlab_main +dast_site_profiles_pipelines: :gitlab_main +dast_sites: :gitlab_main +dast_site_tokens: :gitlab_main +dast_site_validations: :gitlab_main +dep_ci_build_trace_section_names: :gitlab_main +dep_ci_build_trace_sections: :gitlab_main +dependency_proxy_blobs: :gitlab_main +dependency_proxy_group_settings: :gitlab_main +dependency_proxy_image_ttl_group_policies: :gitlab_main +dependency_proxy_manifests: :gitlab_main +deploy_keys_projects: :gitlab_main +deployment_clusters: :gitlab_main +deployment_merge_requests: :gitlab_main +deployments: :gitlab_main +deploy_tokens: :gitlab_main +description_versions: :gitlab_main +design_management_designs: :gitlab_main +design_management_designs_versions: :gitlab_main +design_management_versions: :gitlab_main +design_user_mentions: :gitlab_main +detached_partitions: :gitlab_main +diff_note_positions: :gitlab_main +dora_daily_metrics: :gitlab_main +draft_notes: :gitlab_main +elastic_index_settings: :gitlab_main +elastic_reindexing_slices: :gitlab_main +elastic_reindexing_subtasks: :gitlab_main +elastic_reindexing_tasks: :gitlab_main +elasticsearch_indexed_namespaces: :gitlab_main +elasticsearch_indexed_projects: :gitlab_main +emails: :gitlab_main +environments: :gitlab_main +epic_issues: :gitlab_main +epic_metrics: :gitlab_main +epics: :gitlab_main +epic_user_mentions: :gitlab_main +error_tracking_client_keys: :gitlab_main +error_tracking_error_events: :gitlab_main +error_tracking_errors: :gitlab_main +events: :gitlab_main +evidences: :gitlab_main +experiments: :gitlab_main +experiment_subjects: :gitlab_main +experiment_users: :gitlab_main +external_approval_rules: :gitlab_main +external_approval_rules_protected_branches: :gitlab_main +external_pull_requests: :gitlab_main +external_status_checks: :gitlab_main +external_status_checks_protected_branches: :gitlab_main +feature_gates: :gitlab_main +features: :gitlab_main +fork_network_members: :gitlab_main +fork_networks: :gitlab_main +geo_cache_invalidation_events: :gitlab_main +geo_container_repository_updated_events: :gitlab_main +geo_event_log: :gitlab_main +geo_events: :gitlab_main +geo_hashed_storage_attachments_events: :gitlab_main +geo_hashed_storage_migrated_events: :gitlab_main +geo_job_artifact_deleted_events: :gitlab_main +geo_lfs_object_deleted_events: :gitlab_main +geo_node_namespace_links: :gitlab_main +geo_nodes: :gitlab_main +geo_node_statuses: :gitlab_main +geo_repositories_changed_events: :gitlab_main +geo_repository_created_events: :gitlab_main +geo_repository_deleted_events: :gitlab_main +geo_repository_renamed_events: :gitlab_main +geo_repository_updated_events: :gitlab_main +geo_reset_checksum_events: :gitlab_main +geo_upload_deleted_events: :gitlab_main +gitlab_subscription_histories: :gitlab_main +gitlab_subscriptions: :gitlab_main +gpg_keys: :gitlab_main +gpg_key_subkeys: :gitlab_main +gpg_signatures: :gitlab_main +grafana_integrations: :gitlab_main +group_custom_attributes: :gitlab_main +group_deletion_schedules: :gitlab_main +group_deploy_keys: :gitlab_main +group_deploy_keys_groups: :gitlab_main +group_deploy_tokens: :gitlab_main +group_group_links: :gitlab_main +group_import_states: :gitlab_main +group_merge_request_approval_settings: :gitlab_main +group_repository_storage_moves: :gitlab_main +group_wiki_repositories: :gitlab_main +historical_data: :gitlab_main +identities: :gitlab_main +import_export_uploads: :gitlab_main +import_failures: :gitlab_main +incident_management_escalation_policies: :gitlab_main +incident_management_escalation_rules: :gitlab_main +incident_management_issuable_escalation_statuses: :gitlab_main +incident_management_oncall_participants: :gitlab_main +incident_management_oncall_rotations: :gitlab_main +incident_management_oncall_schedules: :gitlab_main +incident_management_oncall_shifts: :gitlab_main +incident_management_pending_alert_escalations: :gitlab_main +incident_management_pending_issue_escalations: :gitlab_main +index_statuses: :gitlab_main +in_product_marketing_emails: :gitlab_main +insights: :gitlab_main +integrations: :gitlab_main +internal_ids: :gitlab_main +ip_restrictions: :gitlab_main +issuable_metric_images: :gitlab_main +issuable_severities: :gitlab_main +issuable_slas: :gitlab_main +issue_assignees: :gitlab_main +issue_customer_relations_contacts: :gitlab_main +issue_email_participants: :gitlab_main +issue_links: :gitlab_main +issue_metrics: :gitlab_main +issues: :gitlab_main +issues_prometheus_alert_events: :gitlab_main +issues_self_managed_prometheus_alert_events: :gitlab_main +issue_tracker_data: :gitlab_main +issue_user_mentions: :gitlab_main +iterations_cadences: :gitlab_main +jira_connect_installations: :gitlab_main +jira_connect_subscriptions: :gitlab_main +jira_imports: :gitlab_main +jira_tracker_data: :gitlab_main +keys: :gitlab_main +label_links: :gitlab_main +label_priorities: :gitlab_main +labels: :gitlab_main +ldap_group_links: :gitlab_main +lfs_file_locks: :gitlab_main +lfs_objects: :gitlab_main +lfs_objects_projects: :gitlab_main +licenses: :gitlab_main +lists: :gitlab_main +list_user_preferences: :gitlab_main +loose_foreign_keys_deleted_records: :gitlab_main +members: :gitlab_main +merge_request_assignees: :gitlab_main +merge_request_blocks: :gitlab_main +merge_request_cleanup_schedules: :gitlab_main +merge_request_context_commit_diff_files: :gitlab_main +merge_request_context_commits: :gitlab_main +merge_request_diff_commits: :gitlab_main +merge_request_diff_commit_users: :gitlab_main +merge_request_diff_details: :gitlab_main +merge_request_diff_files: :gitlab_main +merge_request_diffs: :gitlab_main +merge_request_metrics: :gitlab_main +merge_request_reviewers: :gitlab_main +merge_requests_closing_issues: :gitlab_main +merge_requests: :gitlab_main +merge_request_user_mentions: :gitlab_main +merge_trains: :gitlab_main +metrics_dashboard_annotations: :gitlab_main +metrics_users_starred_dashboards: :gitlab_main +milestone_releases: :gitlab_main +milestones: :gitlab_main +namespace_admin_notes: :gitlab_main +namespace_aggregation_schedules: :gitlab_main +namespace_limits: :gitlab_main +namespace_package_settings: :gitlab_main +namespace_root_storage_statistics: :gitlab_main +namespace_settings: :gitlab_main +namespaces: :gitlab_main +namespace_statistics: :gitlab_main +note_diff_files: :gitlab_main +notes: :gitlab_main +notification_settings: :gitlab_main +oauth_access_grants: :gitlab_main +oauth_access_tokens: :gitlab_main +oauth_applications: :gitlab_main +oauth_openid_requests: :gitlab_main +onboarding_progresses: :gitlab_main +open_project_tracker_data: :gitlab_main +operations_feature_flags_clients: :gitlab_main +operations_feature_flag_scopes: :gitlab_main +operations_feature_flags: :gitlab_main +operations_feature_flags_issues: :gitlab_main +operations_scopes: :gitlab_main +operations_strategies: :gitlab_main +operations_strategies_user_lists: :gitlab_main +operations_user_lists: :gitlab_main +packages_build_infos: :gitlab_main +packages_composer_cache_files: :gitlab_main +packages_composer_metadata: :gitlab_main +packages_conan_file_metadata: :gitlab_main +packages_conan_metadata: :gitlab_main +packages_debian_file_metadata: :gitlab_main +packages_debian_group_architectures: :gitlab_main +packages_debian_group_component_files: :gitlab_main +packages_debian_group_components: :gitlab_main +packages_debian_group_distribution_keys: :gitlab_main +packages_debian_group_distributions: :gitlab_main +packages_debian_project_architectures: :gitlab_main +packages_debian_project_component_files: :gitlab_main +packages_debian_project_components: :gitlab_main +packages_debian_project_distribution_keys: :gitlab_main +packages_debian_project_distributions: :gitlab_main +packages_debian_publications: :gitlab_main +packages_dependencies: :gitlab_main +packages_dependency_links: :gitlab_main +packages_events: :gitlab_main +packages_helm_file_metadata: :gitlab_main +packages_maven_metadata: :gitlab_main +packages_nuget_dependency_link_metadata: :gitlab_main +packages_nuget_metadata: :gitlab_main +packages_package_file_build_infos: :gitlab_main +packages_package_files: :gitlab_main +packages_packages: :gitlab_main +packages_pypi_metadata: :gitlab_main +packages_rubygems_metadata: :gitlab_main +packages_tags: :gitlab_main +pages_deployments: :gitlab_main +pages_domain_acme_orders: :gitlab_main +pages_domains: :gitlab_main +partitioned_foreign_keys: :gitlab_main +path_locks: :gitlab_main +personal_access_tokens: :gitlab_main +plan_limits: :gitlab_main +plans: :gitlab_main +pool_repositories: :gitlab_main +postgres_async_indexes: :gitlab_main +postgres_reindex_actions: :gitlab_main +product_analytics_events_experimental: :gitlab_main +programming_languages: :gitlab_main +project_access_tokens: :gitlab_main +project_alerting_settings: :gitlab_main +project_aliases: :gitlab_main +project_authorizations: :gitlab_main +project_auto_devops: :gitlab_main +project_ci_cd_settings: :gitlab_main +project_ci_feature_usages: :gitlab_main +project_compliance_framework_settings: :gitlab_main +project_custom_attributes: :gitlab_main +project_daily_statistics: :gitlab_main +project_deploy_tokens: :gitlab_main +project_error_tracking_settings: :gitlab_main +project_export_jobs: :gitlab_main +project_features: :gitlab_main +project_feature_usages: :gitlab_main +project_group_links: :gitlab_main +project_import_data: :gitlab_main +project_incident_management_settings: :gitlab_main +project_metrics_settings: :gitlab_main +project_mirror_data: :gitlab_main +project_pages_metadata: :gitlab_main +project_repositories: :gitlab_main +project_repository_states: :gitlab_main +project_repository_storage_moves: :gitlab_main +project_security_settings: :gitlab_main +project_settings: :gitlab_main +projects: :gitlab_main +project_statistics: :gitlab_main +project_topics: :gitlab_main +project_tracing_settings: :gitlab_main +prometheus_alert_events: :gitlab_main +prometheus_alerts: :gitlab_main +prometheus_metrics: :gitlab_main +protected_branches: :gitlab_main +protected_branch_merge_access_levels: :gitlab_main +protected_branch_push_access_levels: :gitlab_main +protected_branch_unprotect_access_levels: :gitlab_main +protected_environment_deploy_access_levels: :gitlab_main +protected_environments: :gitlab_main +protected_tag_create_access_levels: :gitlab_main +protected_tags: :gitlab_main +push_event_payloads: :gitlab_main +push_rules: :gitlab_main +raw_usage_data: :gitlab_main +redirect_routes: :gitlab_main +release_links: :gitlab_main +releases: :gitlab_main +remote_mirrors: :gitlab_main +repository_languages: :gitlab_main +required_code_owners_sections: :gitlab_main +requirements: :gitlab_main +requirements_management_test_reports: :gitlab_main +resource_iteration_events: :gitlab_main +resource_label_events: :gitlab_main +resource_milestone_events: :gitlab_main +resource_state_events: :gitlab_main +resource_weight_events: :gitlab_main +reviews: :gitlab_main +routes: :gitlab_main +saml_group_links: :gitlab_main +saml_providers: :gitlab_main +scim_identities: :gitlab_main +scim_oauth_access_tokens: :gitlab_main +security_findings: :gitlab_main +security_orchestration_policy_configurations: :gitlab_main +security_orchestration_policy_rule_schedules: :gitlab_main +security_scans: :gitlab_main +self_managed_prometheus_alert_events: :gitlab_main +sent_notifications: :gitlab_main +sentry_issues: :gitlab_main +serverless_domain_cluster: :gitlab_main +service_desk_settings: :gitlab_main +shards: :gitlab_main +slack_integrations: :gitlab_main +smartcard_identities: :gitlab_main +snippet_repositories: :gitlab_main +snippet_repository_storage_moves: :gitlab_main +snippets: :gitlab_main +snippet_statistics: :gitlab_main +snippet_user_mentions: :gitlab_main +software_license_policies: :gitlab_main +software_licenses: :gitlab_main +spam_logs: :gitlab_main +sprints: :gitlab_main +status_check_responses: :gitlab_main +status_page_published_incidents: :gitlab_main +status_page_settings: :gitlab_main +subscriptions: :gitlab_main +suggestions: :gitlab_main +system_note_metadata: :gitlab_main +taggings: :gitlab_ci +tags: :gitlab_ci +term_agreements: :gitlab_main +terraform_states: :gitlab_main +terraform_state_versions: :gitlab_main +timelogs: :gitlab_main +todos: :gitlab_main +token_with_ivs: :gitlab_main +topics: :gitlab_main +trending_projects: :gitlab_main +u2f_registrations: :gitlab_main +upcoming_reconciliations: :gitlab_main +uploads: :gitlab_main +user_agent_details: :gitlab_main +user_callouts: :gitlab_main +user_canonical_emails: :gitlab_main +user_credit_card_validations: :gitlab_main +user_custom_attributes: :gitlab_main +user_details: :gitlab_main +user_follow_users: :gitlab_main +user_group_callouts: :gitlab_main +user_highest_roles: :gitlab_main +user_interacted_projects: :gitlab_main +user_permission_export_uploads: :gitlab_main +user_preferences: :gitlab_main +users: :gitlab_main +users_ops_dashboard_projects: :gitlab_main +users_security_dashboard_projects: :gitlab_main +users_star_projects: :gitlab_main +users_statistics: :gitlab_main +user_statuses: :gitlab_main +user_synced_attributes_metadata: :gitlab_main +verification_codes: :gitlab_main +vulnerabilities: :gitlab_main +vulnerability_exports: :gitlab_main +vulnerability_external_issue_links: :gitlab_main +vulnerability_feedback: :gitlab_main +vulnerability_finding_evidence_assets: :gitlab_main +vulnerability_finding_evidence_headers: :gitlab_main +vulnerability_finding_evidence_requests: :gitlab_main +vulnerability_finding_evidence_responses: :gitlab_main +vulnerability_finding_evidences: :gitlab_main +vulnerability_finding_evidence_sources: :gitlab_main +vulnerability_finding_evidence_supporting_messages: :gitlab_main +vulnerability_finding_links: :gitlab_main +vulnerability_finding_signatures: :gitlab_main +vulnerability_findings_remediations: :gitlab_main +vulnerability_flags: :gitlab_main +vulnerability_historical_statistics: :gitlab_main +vulnerability_identifiers: :gitlab_main +vulnerability_issue_links: :gitlab_main +vulnerability_occurrence_identifiers: :gitlab_main +vulnerability_occurrence_pipelines: :gitlab_main +vulnerability_occurrences: :gitlab_main +vulnerability_remediations: :gitlab_main +vulnerability_scanners: :gitlab_main +vulnerability_statistics: :gitlab_main +vulnerability_user_mentions: :gitlab_main +webauthn_registrations: :gitlab_main +web_hook_logs: :gitlab_main +web_hooks: :gitlab_main +wiki_page_meta: :gitlab_main +wiki_page_slugs: :gitlab_main +work_item_types: :gitlab_main +x509_certificates: :gitlab_main +x509_commit_signatures: :gitlab_main +x509_issuers: :gitlab_main +zentao_tracker_data: :gitlab_main +zoom_meetings: :gitlab_main diff --git a/spec/support/database/prevent_cross_database_modification.rb b/spec/support/database/prevent_cross_database_modification.rb index c793c1c008b..fe9e8a6e021 100644 --- a/spec/support/database/prevent_cross_database_modification.rb +++ b/spec/support/database/prevent_cross_database_modification.rb @@ -91,6 +91,11 @@ module Database return if tables.empty? + # All migrations will write to schema_migrations in the same transaction. + # It's safe to ignore this since schema_migrations exists in all + # databases + return if tables == ['schema_migrations'] + cross_database_context[:modified_tables_by_db][database].merge(tables) all_tables = cross_database_context[:modified_tables_by_db].values.map(&:to_a).flatten diff --git a/spec/support_specs/database/gitlab_schema_spec.rb b/spec/support_specs/database/gitlab_schema_spec.rb new file mode 100644 index 00000000000..693071bfd60 --- /dev/null +++ b/spec/support_specs/database/gitlab_schema_spec.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true +require 'spec_helper' + +RSpec.describe Database::GitlabSchema do + it 'matches all the tables in the database', :aggregate_failures do + # These tables do not need a gitlab_schema + excluded_tables = %w(ar_internal_metadata schema_migrations) + + all_tables_in_database = ApplicationRecord.connection.tables + + all_tables_with_gitlab_schema = described_class.tables_to_schema.keys + + missing = [] + all_tables_in_database.each do |table_in_database| + next if table_in_database.in?(excluded_tables) + + missing << table_in_database unless all_tables_with_gitlab_schema.include?(table_in_database) + end + + extras = [] + all_tables_with_gitlab_schema.each do |table_with_gitlab_schema| + extras << table_with_gitlab_schema unless all_tables_in_database.include?(table_with_gitlab_schema) + end + + expect(missing).to be_empty, "Missing table(s) #{missing} not found in #{described_class}.tables_to_schema. Any new tables must be added to spec/support/database/gitlab_schemas.yml ." + + expect(extras).to be_empty, "Extra table(s) #{extras} found in #{described_class}.tables_to_schema. Any removed or renamed tables must be removed from spec/support/database/gitlab_schemas.yml ." + end +end diff --git a/spec/workers/database/drop_detached_partitions_worker_spec.rb b/spec/workers/database/drop_detached_partitions_worker_spec.rb index 8693878ddd5..a10fcaaa5d9 100644 --- a/spec/workers/database/drop_detached_partitions_worker_spec.rb +++ b/spec/workers/database/drop_detached_partitions_worker_spec.rb @@ -6,21 +6,19 @@ RSpec.describe Database::DropDetachedPartitionsWorker do describe '#perform' do subject { described_class.new.perform } - let(:monitoring) { instance_double('PartitionMonitoring', report_metrics: nil) } - before do allow(Gitlab::Database::Partitioning).to receive(:drop_detached_partitions) - allow(Gitlab::Database::Partitioning::PartitionMonitoring).to receive(:new).and_return(monitoring) + allow(Gitlab::Database::Partitioning).to receive(:report_metrics) end - it 'delegates to Partitioning.drop_detached_partitions' do + it 'drops detached partitions' do expect(Gitlab::Database::Partitioning).to receive(:drop_detached_partitions) subject end it 'reports partition metrics' do - expect(monitoring).to receive(:report_metrics) + expect(Gitlab::Database::Partitioning).to receive(:report_metrics) subject end diff --git a/spec/workers/database/partition_management_worker_spec.rb b/spec/workers/database/partition_management_worker_spec.rb index 9ded36743a8..e5362e95f48 100644 --- a/spec/workers/database/partition_management_worker_spec.rb +++ b/spec/workers/database/partition_management_worker_spec.rb @@ -6,20 +6,19 @@ RSpec.describe Database::PartitionManagementWorker do describe '#perform' do subject { described_class.new.perform } - let(:monitoring) { instance_double('PartitionMonitoring', report_metrics: nil) } - before do - allow(Gitlab::Database::Partitioning::PartitionMonitoring).to receive(:new).and_return(monitoring) + allow(Gitlab::Database::Partitioning).to receive(:sync_partitions) + allow(Gitlab::Database::Partitioning).to receive(:report_metrics) end - it 'delegates to Partitioning' do + it 'syncs partitions' do expect(Gitlab::Database::Partitioning).to receive(:sync_partitions) subject end it 'reports partition metrics' do - expect(monitoring).to receive(:report_metrics) + expect(Gitlab::Database::Partitioning).to receive(:report_metrics) subject end |