diff --git a/app/assets/javascripts/alert_management/graphql/fragments/detail_item.fragment.graphql b/app/assets/javascripts/alert_management/graphql/fragments/detail_item.fragment.graphql index 0712ff12c23..00286ec9096 100644 --- a/app/assets/javascripts/alert_management/graphql/fragments/detail_item.fragment.graphql +++ b/app/assets/javascripts/alert_management/graphql/fragments/detail_item.fragment.graphql @@ -10,6 +10,7 @@ fragment AlertDetailItem on AlertManagementAlert { description updatedAt endedAt + hosts details runbook todos { diff --git a/app/assets/javascripts/issue_show/components/incidents/graphql/queries/get_alert.graphql b/app/assets/javascripts/issue_show/components/incidents/graphql/queries/get_alert.graphql index 00ddc80432d..bb637dea033 100644 --- a/app/assets/javascripts/issue_show/components/incidents/graphql/queries/get_alert.graphql +++ b/app/assets/javascripts/issue_show/components/incidents/graphql/queries/get_alert.graphql @@ -13,6 +13,7 @@ query getAlert($iid: String!, $fullPath: ID!) { service description endedAt + hosts details } } diff --git a/app/assets/javascripts/packages/list/coming_soon/helpers.js b/app/assets/javascripts/packages/list/coming_soon/helpers.js deleted file mode 100644 index 5b6a4b3aa87..00000000000 --- a/app/assets/javascripts/packages/list/coming_soon/helpers.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Context: - * https://gitlab.com/gitlab-org/gitlab/-/issues/198524 - * https://gitlab.com/gitlab-org/gitlab/-/merge_requests/29491 - * - */ - -/** - * Constants - * - * LABEL_NAMES - an array of labels to filter issues in the GraphQL query - * WORKFLOW_PREFIX - the prefix for workflow labels - * ACCEPTING_CONTRIBUTIONS_TITLE - the accepting contributions label - */ -export const LABEL_NAMES = ['Package::Coming soon']; -const WORKFLOW_PREFIX = 'workflow::'; -const ACCEPTING_CONTRIBUTIONS_TITLE = 'accepting merge requests'; - -const setScoped = (label, scoped) => (label ? { ...label, scoped } : label); - -/** - * Finds workflow:: scoped labels and returns the first or null. - * @param {Object[]} labels Labels from the issue - */ -export const findWorkflowLabel = (labels = []) => - labels.find(l => l.title.toLowerCase().includes(WORKFLOW_PREFIX.toLowerCase())); - -/** - * Determines if an issue is accepting community contributions by checking if - * the "Accepting merge requests" label is present. - * @param {Object[]} labels - */ -export const findAcceptingContributionsLabel = (labels = []) => - labels.find(l => l.title.toLowerCase() === ACCEPTING_CONTRIBUTIONS_TITLE.toLowerCase()); - -/** - * Formats the GraphQL response into the format that the view template expects. - * @param {Object} data GraphQL response - */ -export const toViewModel = data => { - // This just flatterns the issues -> nodes and labels -> nodes hierarchy - // into an array of objects. - const issues = (data.project?.issues?.nodes || []).map(i => ({ - ...i, - labels: (i.labels?.nodes || []).map(node => node), - })); - - return issues.map(x => ({ - ...x, - labels: [ - setScoped(findWorkflowLabel(x.labels), true), - setScoped(findAcceptingContributionsLabel(x.labels), false), - ].filter(Boolean), - })); -}; diff --git a/app/assets/javascripts/packages/list/coming_soon/packages_coming_soon.vue b/app/assets/javascripts/packages/list/coming_soon/packages_coming_soon.vue deleted file mode 100644 index 766402d3619..00000000000 --- a/app/assets/javascripts/packages/list/coming_soon/packages_coming_soon.vue +++ /dev/null @@ -1,172 +0,0 @@ - - - diff --git a/app/assets/javascripts/packages/list/coming_soon/queries/issues.graphql b/app/assets/javascripts/packages/list/coming_soon/queries/issues.graphql deleted file mode 100644 index 36c27d9ad70..00000000000 --- a/app/assets/javascripts/packages/list/coming_soon/queries/issues.graphql +++ /dev/null @@ -1,20 +0,0 @@ -query getComingSoonIssues($projectPath: ID!, $labelNames: [String]) { - project(fullPath: $projectPath) { - issues(state: opened, labelName: $labelNames) { - nodes { - iid - title - webUrl - labels { - nodes { - title - color - } - } - milestone { - title - } - } - } - } -} diff --git a/app/assets/javascripts/packages/list/components/packages_list_app.vue b/app/assets/javascripts/packages/list/components/packages_list_app.vue index ad60ee6f379..cbb3bfd35ac 100644 --- a/app/assets/javascripts/packages/list/components/packages_list_app.vue +++ b/app/assets/javascripts/packages/list/components/packages_list_app.vue @@ -9,7 +9,6 @@ import PackageFilter from './packages_filter.vue'; import PackageList from './packages_list.vue'; import PackageSort from './packages_sort.vue'; import { PACKAGE_REGISTRY_TABS, DELETE_PACKAGE_SUCCESS_MESSAGE } from '../constants'; -import PackagesComingSoon from '../coming_soon/packages_coming_soon.vue'; import PackageTitle from './package_title.vue'; export default { @@ -22,14 +21,12 @@ export default { PackageFilter, PackageList, PackageSort, - PackagesComingSoon, PackageTitle, }, computed: { ...mapState({ emptyListIllustration: state => state.config.emptyListIllustration, emptyListHelpUrl: state => state.config.emptyListHelpUrl, - comingSoon: state => state.config.comingSoon, filterQuery: state => state.filterQuery, selectedType: state => state.selectedType, packageHelpUrl: state => state.config.packageHelpUrl, @@ -122,14 +119,6 @@ export default { - - - - diff --git a/app/assets/javascripts/packages/list/stores/mutations.js b/app/assets/javascripts/packages/list/stores/mutations.js index a47ba356c0a..2fe7981b3d9 100644 --- a/app/assets/javascripts/packages/list/stores/mutations.js +++ b/app/assets/javascripts/packages/list/stores/mutations.js @@ -1,19 +1,12 @@ import * as types from './mutation_types'; -import { - parseIntPagination, - normalizeHeaders, - convertObjectPropsToCamelCase, -} from '~/lib/utils/common_utils'; +import { parseIntPagination, normalizeHeaders } from '~/lib/utils/common_utils'; import { GROUP_PAGE_TYPE } from '../constants'; export default { [types.SET_INITIAL_STATE](state, config) { const { comingSoonJson, ...rest } = config; - const comingSoonObj = JSON.parse(comingSoonJson); - state.config = { ...rest, - comingSoon: comingSoonObj && convertObjectPropsToCamelCase(comingSoonObj), isGroupPage: config.pageType === GROUP_PAGE_TYPE, }; }, diff --git a/app/assets/javascripts/packages/shared/constants.js b/app/assets/javascripts/packages/shared/constants.js index e5131db59bf..c481abd8658 100644 --- a/app/assets/javascripts/packages/shared/constants.js +++ b/app/assets/javascripts/packages/shared/constants.js @@ -14,9 +14,6 @@ export const TrackingActions = { REQUEST_DELETE_PACKAGE: 'request_delete_package', CANCEL_DELETE_PACKAGE: 'cancel_delete_package', PULL_PACKAGE: 'pull_package', - COMING_SOON_REQUESTED: 'activate_coming_soon_requested', - COMING_SOON_LIST: 'click_coming_soon_issue_link', - COMING_SOON_HELP: 'click_coming_soon_documentation_link', }; export const TrackingCategories = { diff --git a/app/assets/javascripts/pages/projects/new/index.js b/app/assets/javascripts/pages/projects/new/index.js index 637ed28a758..477a1ab887b 100644 --- a/app/assets/javascripts/pages/projects/new/index.js +++ b/app/assets/javascripts/pages/projects/new/index.js @@ -3,13 +3,14 @@ import initProjectNew from '../../../projects/project_new'; import { __ } from '~/locale'; import { deprecatedCreateFlash as createFlash } from '~/flash'; import Tracking from '~/tracking'; +import { isExperimentEnabled } from '~/lib/utils/experimentation'; document.addEventListener('DOMContentLoaded', () => { initProjectVisibilitySelector(); initProjectNew.bindEvents(); const { category, property } = gon.tracking_data ?? { category: 'projects:new' }; - const hasNewCreateProjectUi = 'newCreateProjectUi' in gon?.features; + const hasNewCreateProjectUi = isExperimentEnabled('newCreateProjectUi'); if (!hasNewCreateProjectUi) { // Setting additional tracking for HAML template diff --git a/app/assets/javascripts/pages/shared/wikis/wikis.js b/app/assets/javascripts/pages/shared/wikis/wikis.js index 41d43812b5d..ab948fd106f 100644 --- a/app/assets/javascripts/pages/shared/wikis/wikis.js +++ b/app/assets/javascripts/pages/shared/wikis/wikis.js @@ -10,7 +10,7 @@ const MARKDOWN_LINK_TEXT = { }; const TRACKING_EVENT_NAME = 'view_wiki_page'; -const TRACKING_CONTEXT_SCHEMA = 'iglu:com.gitlab/wiki_page_context/jsonschema/1-0-0'; +const TRACKING_CONTEXT_SCHEMA = 'iglu:com.gitlab/wiki_page_context/jsonschema/1-0-1'; export default class Wikis { constructor() { diff --git a/app/assets/javascripts/vue_shared/components/alert_details_table.vue b/app/assets/javascripts/vue_shared/components/alert_details_table.vue index a70b8e11a83..3d445626303 100644 --- a/app/assets/javascripts/vue_shared/components/alert_details_table.vue +++ b/app/assets/javascripts/vue_shared/components/alert_details_table.vue @@ -23,6 +23,7 @@ const allowedFields = [ 'endedAt', 'details', 'environment', + 'hosts', ]; const isAllowed = fieldName => allowedFields.includes(fieldName); diff --git a/app/controllers/google_api/authorizations_controller.rb b/app/controllers/google_api/authorizations_controller.rb index 5723ccc14a7..76a1c43dfa3 100644 --- a/app/controllers/google_api/authorizations_controller.rb +++ b/app/controllers/google_api/authorizations_controller.rb @@ -6,6 +6,8 @@ module GoogleApi before_action :validate_session_key! + feature_category :kubernetes_management + def callback token, expires_at = GoogleApi::CloudPlatform::Client .new(nil, callback_google_api_auth_url) diff --git a/app/controllers/graphql_controller.rb b/app/controllers/graphql_controller.rb index b004851587a..5edad410724 100644 --- a/app/controllers/graphql_controller.rb +++ b/app/controllers/graphql_controller.rb @@ -26,6 +26,8 @@ class GraphqlController < ApplicationController # callback execution order here around_action :sessionless_bypass_admin_mode!, if: :sessionless_user? + feature_category :not_owned + def execute result = multiplex? ? execute_multiplex : execute_query @@ -113,6 +115,12 @@ class GraphqlController < ApplicationController # Merging to :metadata will ensure these are logged as top level keys payload[:metadata] ||= {} - payload[:metadata].merge!(graphql: { operation_name: params[:operationName] }) + payload[:metadata].merge!(graphql: logs) + end + + def logs + RequestStore.store[:graphql_logs].to_h + .except(:duration_s, :query_string) + .merge(operation_name: params[:operationName]) end end diff --git a/app/controllers/groups/avatars_controller.rb b/app/controllers/groups/avatars_controller.rb index 8e4dc2bb6e9..1f13be449a9 100644 --- a/app/controllers/groups/avatars_controller.rb +++ b/app/controllers/groups/avatars_controller.rb @@ -5,6 +5,8 @@ class Groups::AvatarsController < Groups::ApplicationController skip_cross_project_access_check :destroy + feature_category :subgroups + def destroy @group.remove_avatar! @group.save diff --git a/app/controllers/groups/boards_controller.rb b/app/controllers/groups/boards_controller.rb index ea7e83a2caf..b971c5783a8 100644 --- a/app/controllers/groups/boards_controller.rb +++ b/app/controllers/groups/boards_controller.rb @@ -12,6 +12,8 @@ class Groups::BoardsController < Groups::ApplicationController push_frontend_feature_flag(:boards_with_swimlanes, group, default_enabled: false) end + feature_category :boards + private def assign_endpoint_vars diff --git a/app/controllers/groups/children_controller.rb b/app/controllers/groups/children_controller.rb index 236a19a8dc4..718914dea35 100644 --- a/app/controllers/groups/children_controller.rb +++ b/app/controllers/groups/children_controller.rb @@ -5,6 +5,8 @@ module Groups before_action :group skip_cross_project_access_check :index + feature_category :subgroups + def index parent = if params[:parent_id].present? GroupFinder.new(current_user).execute(id: params[:parent_id]) diff --git a/app/controllers/groups/deploy_tokens_controller.rb b/app/controllers/groups/deploy_tokens_controller.rb index de951f2cb9f..79152bf2695 100644 --- a/app/controllers/groups/deploy_tokens_controller.rb +++ b/app/controllers/groups/deploy_tokens_controller.rb @@ -3,6 +3,8 @@ class Groups::DeployTokensController < Groups::ApplicationController before_action :authorize_destroy_deploy_token! + feature_category :continuous_delivery + def revoke @token = @group.deploy_tokens.find(params[:id]) @token.revoke! diff --git a/app/controllers/groups/group_links_controller.rb b/app/controllers/groups/group_links_controller.rb index 06c793b5c4c..3b775af9722 100644 --- a/app/controllers/groups/group_links_controller.rb +++ b/app/controllers/groups/group_links_controller.rb @@ -4,6 +4,8 @@ class Groups::GroupLinksController < Groups::ApplicationController before_action :authorize_admin_group! before_action :group_link, only: [:update, :destroy] + feature_category :subgroups + def create shared_with_group = Group.find(params[:shared_with_group_id]) if params[:shared_with_group_id].present? diff --git a/app/controllers/groups/group_members_controller.rb b/app/controllers/groups/group_members_controller.rb index 63311ab983b..7cf07afd63b 100644 --- a/app/controllers/groups/group_members_controller.rb +++ b/app/controllers/groups/group_members_controller.rb @@ -19,6 +19,8 @@ class Groups::GroupMembersController < Groups::ApplicationController :approve_access_request, :leave, :resend_invite, :override + feature_category :authentication_and_authorization + def index @sort = params[:sort].presence || sort_value_name diff --git a/app/controllers/groups/imports_controller.rb b/app/controllers/groups/imports_controller.rb index b611685f9bc..7cf39e378db 100644 --- a/app/controllers/groups/imports_controller.rb +++ b/app/controllers/groups/imports_controller.rb @@ -3,6 +3,8 @@ class Groups::ImportsController < Groups::ApplicationController include ContinueParams + feature_category :importers + def show if @group.import_state.nil? || @group.import_state.finished? if continue_params[:to] diff --git a/app/controllers/groups/labels_controller.rb b/app/controllers/groups/labels_controller.rb index 97d9f8fcecd..34856f8d84e 100644 --- a/app/controllers/groups/labels_controller.rb +++ b/app/controllers/groups/labels_controller.rb @@ -10,6 +10,8 @@ class Groups::LabelsController < Groups::ApplicationController respond_to :html + feature_category :issue_tracking + def index respond_to do |format| format.html do diff --git a/app/controllers/groups/milestones_controller.rb b/app/controllers/groups/milestones_controller.rb index 3f2894d378b..173a24ceb74 100644 --- a/app/controllers/groups/milestones_controller.rb +++ b/app/controllers/groups/milestones_controller.rb @@ -9,6 +9,8 @@ class Groups::MilestonesController < Groups::ApplicationController push_frontend_feature_flag(:burnup_charts, @group) end + feature_category :issue_tracking + def index respond_to do |format| format.html do diff --git a/app/controllers/groups/packages_controller.rb b/app/controllers/groups/packages_controller.rb index 600acc72e67..47f1816cc4c 100644 --- a/app/controllers/groups/packages_controller.rb +++ b/app/controllers/groups/packages_controller.rb @@ -4,6 +4,8 @@ module Groups class PackagesController < Groups::ApplicationController before_action :verify_packages_enabled! + feature_category :package_registry + private def verify_packages_enabled! diff --git a/app/controllers/groups/registry/repositories_controller.rb b/app/controllers/groups/registry/repositories_controller.rb index 87a62a8f9b0..d914e0bffc6 100644 --- a/app/controllers/groups/registry/repositories_controller.rb +++ b/app/controllers/groups/registry/repositories_controller.rb @@ -7,6 +7,8 @@ module Groups before_action :verify_container_registry_enabled! before_action :authorize_read_container_image! + feature_category :package_registry + def index respond_to do |format| format.html diff --git a/app/controllers/groups/releases_controller.rb b/app/controllers/groups/releases_controller.rb index 500c57a6f3e..6a42f30b847 100644 --- a/app/controllers/groups/releases_controller.rb +++ b/app/controllers/groups/releases_controller.rb @@ -2,6 +2,8 @@ module Groups class ReleasesController < Groups::ApplicationController + feature_category :release_evidence + def index respond_to do |format| format.json do diff --git a/app/controllers/groups/runners_controller.rb b/app/controllers/groups/runners_controller.rb index edebffe2912..dbfd31ebcad 100644 --- a/app/controllers/groups/runners_controller.rb +++ b/app/controllers/groups/runners_controller.rb @@ -7,6 +7,8 @@ class Groups::RunnersController < Groups::ApplicationController before_action :runner, only: [:edit, :update, :destroy, :pause, :resume, :show] + feature_category :continuous_integration + def show render 'shared/runners/show' end diff --git a/app/controllers/groups/settings/ci_cd_controller.rb b/app/controllers/groups/settings/ci_cd_controller.rb index ceee049d824..0c72c8a037b 100644 --- a/app/controllers/groups/settings/ci_cd_controller.rb +++ b/app/controllers/groups/settings/ci_cd_controller.rb @@ -13,6 +13,8 @@ module Groups end before_action :define_variables, only: [:show] + feature_category :continuous_integration + NUMBER_OF_RUNNERS_PER_PAGE = 4 def show diff --git a/app/controllers/groups/settings/integrations_controller.rb b/app/controllers/groups/settings/integrations_controller.rb index e8551a7f270..b089cfdf341 100644 --- a/app/controllers/groups/settings/integrations_controller.rb +++ b/app/controllers/groups/settings/integrations_controller.rb @@ -7,6 +7,8 @@ module Groups before_action :authorize_admin_group! + feature_category :integrations + def index @integrations = Service.find_or_initialize_all(Service.for_group(group)).sort_by(&:title) end diff --git a/app/controllers/groups/settings/repository_controller.rb b/app/controllers/groups/settings/repository_controller.rb index e2fbdc39692..ccc1fa12458 100644 --- a/app/controllers/groups/settings/repository_controller.rb +++ b/app/controllers/groups/settings/repository_controller.rb @@ -10,6 +10,8 @@ module Groups push_frontend_feature_flag(:ajax_new_deploy_token, @group) end + feature_category :continuous_delivery + def create_deploy_token result = Groups::DeployTokens::CreateService.new(@group, current_user, deploy_token_params).execute @new_deploy_token = result[:deploy_token] diff --git a/app/controllers/groups/shared_projects_controller.rb b/app/controllers/groups/shared_projects_controller.rb index 30b7bfc70ae..90ec64d4768 100644 --- a/app/controllers/groups/shared_projects_controller.rb +++ b/app/controllers/groups/shared_projects_controller.rb @@ -6,6 +6,8 @@ module Groups before_action :group skip_cross_project_access_check :index + feature_category :subgroups + def index shared_projects = GroupProjectsFinder.new( group: group, diff --git a/app/controllers/groups/uploads_controller.rb b/app/controllers/groups/uploads_controller.rb index 3ae7e36c740..49249f87d31 100644 --- a/app/controllers/groups/uploads_controller.rb +++ b/app/controllers/groups/uploads_controller.rb @@ -9,6 +9,8 @@ class Groups::UploadsController < Groups::ApplicationController before_action :authorize_upload_file!, only: [:create, :authorize] before_action :verify_workhorse_api!, only: [:authorize] + feature_category :subgroups + private def upload_model_class diff --git a/app/controllers/groups/variables_controller.rb b/app/controllers/groups/variables_controller.rb index fb639f6e472..51670325ce3 100644 --- a/app/controllers/groups/variables_controller.rb +++ b/app/controllers/groups/variables_controller.rb @@ -6,6 +6,8 @@ module Groups skip_cross_project_access_check :show, :update + feature_category :continuous_integration + def show respond_to do |format| format.json do diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 2d6f5d0377a..833350d4a68 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -46,6 +46,17 @@ class GroupsController < Groups::ApplicationController layout :determine_layout + feature_category :subgroups, [ + :index, :new, :create, :show, :edit, :update, + :destroy, :details, :transfer + ] + + feature_category :audit_events, [:activity] + feature_category :issue_tracking, [:issues, :issues_calendar, :preview_markdown] + feature_category :code_review, [:merge_requests] + feature_category :projects, [:projects] + feature_category :importers, [:export, :download_export] + def index redirect_to(current_user ? dashboard_groups_path : explore_groups_path) end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 848625ff6b5..88a4a276750 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -37,7 +37,7 @@ class ProjectsController < Projects::ApplicationController # Experiments before_action only: [:new, :create] do frontend_experimentation_tracking_data(:new_create_project_ui, 'click_tab') - push_frontend_feature_flag(:new_create_project_ui) if experiment_enabled?(:new_create_project_ui) + push_frontend_experiment(:new_create_project_ui) end before_action only: [:edit] do diff --git a/app/graphql/mutations/notes/update/image_diff_note.rb b/app/graphql/mutations/notes/update/image_diff_note.rb index 7aad3af1e04..31b8828001b 100644 --- a/app/graphql/mutations/notes/update/image_diff_note.rb +++ b/app/graphql/mutations/notes/update/image_diff_note.rb @@ -28,7 +28,7 @@ module Mutations 'body or position arguments are required' end - super(args) + super(**args) end private diff --git a/app/helpers/packages_helper.rb b/app/helpers/packages_helper.rb index 0a296b4e6ba..a3a899dbe1a 100644 --- a/app/helpers/packages_helper.rb +++ b/app/helpers/packages_helper.rb @@ -34,26 +34,12 @@ module PackagesHelper expose_url(api_v4_group___packages_composer_packages_path(id: group_id, format: '.json')) end - def packages_coming_soon_enabled?(resource) - ::Feature.enabled?(:packages_coming_soon, resource) && ::Gitlab.dev_env_or_com? - end - - def packages_coming_soon_data(resource) - return unless packages_coming_soon_enabled?(resource) - - { - project_path: ::Gitlab.com? ? 'gitlab-org/gitlab' : 'gitlab-org/gitlab-test', - suggested_contributions: help_page_path('user/packages/index', anchor: 'suggested-contributions') - } - end - def packages_list_data(type, resource) { resource_id: resource.id, page_type: type, empty_list_help_url: help_page_path('user/packages/package_registry/index'), empty_list_illustration: image_path('illustrations/no-packages.svg'), - coming_soon_json: packages_coming_soon_data(resource).to_json, package_help_url: help_page_path('user/packages/index') } end diff --git a/app/helpers/wiki_helper.rb b/app/helpers/wiki_helper.rb index 8c756b9370b..786081ca815 100644 --- a/app/helpers/wiki_helper.rb +++ b/app/helpers/wiki_helper.rb @@ -142,7 +142,8 @@ module WikiHelper 'wiki-format' => page.format, 'wiki-title-size' => page.title.bytesize, 'wiki-content-size' => page.raw_content.bytesize, - 'wiki-directory-nest-level' => page.path.scan('/').count + 'wiki-directory-nest-level' => page.path.scan('/').count, + 'wiki-container-type' => page.wiki.container.class.name } end diff --git a/app/models/alert_management/alert.rb b/app/models/alert_management/alert.rb index fea7e962783..b92bcec4988 100644 --- a/app/models/alert_management/alert.rb +++ b/app/models/alert_management/alert.rb @@ -21,13 +21,6 @@ module AlertManagement ignored: 3 }.freeze - STATUS_EVENTS = { - triggered: :trigger, - acknowledged: :acknowledge, - resolved: :resolve, - ignored: :ignore - }.freeze - OPEN_STATUSES = [ :triggered, :acknowledged @@ -190,6 +183,15 @@ module AlertManagement reference.to_i > 0 && reference.to_i <= Gitlab::Database::MAX_INT_VALUE end + def status_event_for(status) + self.class.state_machines[:status].events.transitions_for(self, to: status.to_s.to_sym).first&.event + end + + def change_status_to(new_status) + event = status_event_for(new_status) + event && fire_status_event(event) + end + def prometheus? monitoring_tool == Gitlab::AlertManagement::Payload::MONITORING_TOOLS[:prometheus] end diff --git a/app/models/design_management/design_at_version.rb b/app/models/design_management/design_at_version.rb index b4cafb93c2c..0cf653ce696 100644 --- a/app/models/design_management/design_at_version.rb +++ b/app/models/design_management/design_at_version.rb @@ -22,7 +22,7 @@ module DesignManagement end def self.instantiate(attrs) - new(attrs).tap { |obj| obj.validate! } + new(**attrs).tap { |obj| obj.validate! } end # The ID, needed by GraphQL types and as part of the Lazy-fetch diff --git a/app/models/project.rb b/app/models/project.rb index 8eac170746c..8e0e6c5932d 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -367,6 +367,7 @@ class Project < ApplicationRecord allow_destroy: true, reject_if: ->(attrs) { attrs[:id].blank? && attrs[:url].blank? } + accepts_nested_attributes_for :tracing_setting, update_only: true, allow_destroy: true accepts_nested_attributes_for :incident_management_setting, update_only: true accepts_nested_attributes_for :error_tracking_setting, update_only: true accepts_nested_attributes_for :metrics_setting, update_only: true, allow_destroy: true diff --git a/app/models/user.rb b/app/models/user.rb index 5bbdb2b2e9a..5ef1498bd85 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -304,13 +304,18 @@ class User < ApplicationRecord transition deactivated: :active transition blocked: :active transition ldap_blocked: :active + transition blocked_pending_approval: :active + end + + event :block_pending_approval do + transition active: :blocked_pending_approval end event :deactivate do transition active: :deactivated end - state :blocked, :ldap_blocked do + state :blocked, :ldap_blocked, :blocked_pending_approval do def blocked? true end @@ -333,7 +338,7 @@ class User < ApplicationRecord # Scopes scope :admins, -> { where(admin: true) } - scope :blocked, -> { with_states(:blocked, :ldap_blocked) } + scope :blocked, -> { with_states(:blocked, :ldap_blocked, :blocked_pending_approval) } scope :external, -> { where(external: true) } scope :confirmed, -> { where.not(confirmed_at: nil) } scope :active, -> { with_state(:active).non_internal } @@ -378,7 +383,9 @@ class User < ApplicationRecord # The messages for these keys are defined in `devise.en.yml` def inactive_message - if blocked? + if blocked_pending_approval? + :blocked_pending_approval + elsif blocked? :blocked elsif internal? :forbidden diff --git a/app/services/alert_management/alerts/update_service.rb b/app/services/alert_management/alerts/update_service.rb index 18d615aa7e7..a7c8af908fe 100644 --- a/app/services/alert_management/alerts/update_service.rb +++ b/app/services/alert_management/alerts/update_service.rb @@ -112,7 +112,7 @@ module AlertManagement def filter_status return unless params[:status] - status_event = AlertManagement::Alert::STATUS_EVENTS[status_key] + status_event = alert.status_event_for(status_key) unless status_event param_errors << _('Invalid status') diff --git a/app/services/ci/update_build_state_service.rb b/app/services/ci/update_build_state_service.rb index cc8e2060888..cbb43c3c59e 100644 --- a/app/services/ci/update_build_state_service.rb +++ b/app/services/ci/update_build_state_service.rb @@ -6,6 +6,7 @@ module Ci include ::Gitlab::ExclusiveLeaseHelpers Result = Struct.new(:status, :backoff, keyword_init: true) + InvalidTraceError = Class.new(StandardError) ACCEPT_TIMEOUT = 5.minutes.freeze @@ -76,8 +77,20 @@ module Ci metrics.increment_trace_operation(operation: :finalized) end - unless ::Gitlab::Ci::Trace::Checksum.new(build).valid? - metrics.increment_trace_operation(operation: :invalid) + ::Gitlab::Ci::Trace::Checksum.new(build).then do |checksum| + unless checksum.valid? + metrics.increment_trace_operation(operation: :invalid) + + next unless log_invalid_chunks? + + ::Gitlab::ErrorTracking.log_exception(InvalidTraceError.new, + project_path: build.project.full_path, + build_id: build.id, + state_crc32: checksum.state_crc32, + chunks_crc32: checksum.chunks_crc32, + chunks_count: checksum.chunks_count + ) + end end end @@ -182,5 +195,9 @@ module Ci def chunks_migration_enabled? ::Gitlab::Ci::Features.accept_trace?(build.project) end + + def log_invalid_chunks? + ::Gitlab::Ci::Features.log_invalid_trace_chunks?(build.project) + end end end diff --git a/app/services/projects/operations/update_service.rb b/app/services/projects/operations/update_service.rb index 7af489c3751..7dfe7fffa1b 100644 --- a/app/services/projects/operations/update_service.rb +++ b/app/services/projects/operations/update_service.rb @@ -18,6 +18,7 @@ module Projects .merge(grafana_integration_params) .merge(prometheus_integration_params) .merge(incident_management_setting_params) + .merge(tracing_setting_params) end def alerting_setting_params @@ -121,6 +122,15 @@ module Projects { incident_management_setting_attributes: attrs } end + + def tracing_setting_params + attr = params[:tracing_setting_attributes] + return {} unless attr + + destroy = attr[:external_url].blank? + + { tracing_setting_attributes: attr.merge(_destroy: destroy) } + end end end end diff --git a/changelogs/unreleased/feat-jcunha-adds-terraform-ci-latest-template.yml b/changelogs/unreleased/feat-jcunha-adds-terraform-ci-latest-template.yml new file mode 100644 index 00000000000..563b7d65650 --- /dev/null +++ b/changelogs/unreleased/feat-jcunha-adds-terraform-ci-latest-template.yml @@ -0,0 +1,6 @@ +--- +title: Adds a Terraform.latest.gitlab-ci.yml to support quick development of Terraform + related features +merge_request: 43802 +author: +type: added diff --git a/changelogs/unreleased/issue_237977.yml b/changelogs/unreleased/issue_237977.yml new file mode 100644 index 00000000000..97ba5a982a8 --- /dev/null +++ b/changelogs/unreleased/issue_237977.yml @@ -0,0 +1,5 @@ +--- +title: Populate issues blocking_issues_count +merge_request: 42277 +author: +type: other diff --git a/changelogs/unreleased/mwaw-230438-log-usage-data-failed-queries.yml b/changelogs/unreleased/mwaw-230438-log-usage-data-failed-queries.yml new file mode 100644 index 00000000000..72033578f4d --- /dev/null +++ b/changelogs/unreleased/mwaw-230438-log-usage-data-failed-queries.yml @@ -0,0 +1,5 @@ +--- +title: Log failed BatchCount queries +merge_request: 41552 +author: +type: added diff --git a/changelogs/unreleased/tr-add-detail-fields-to-table.yml b/changelogs/unreleased/tr-add-detail-fields-to-table.yml new file mode 100644 index 00000000000..f4992b7a0f6 --- /dev/null +++ b/changelogs/unreleased/tr-add-detail-fields-to-table.yml @@ -0,0 +1,5 @@ +--- +title: Add hosts field to alert detail table +merge_request: 43087 +author: +type: changed diff --git a/config/feature_flags/development/ci_artifacts_exclude.yml b/config/feature_flags/development/ci_artifacts_exclude.yml index 6e9d27efe42..86398f085d8 100644 --- a/config/feature_flags/development/ci_artifacts_exclude.yml +++ b/config/feature_flags/development/ci_artifacts_exclude.yml @@ -1,7 +1,7 @@ --- name: ci_artifacts_exclude -introduced_by_url: -rollout_issue_url: -group: +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/30708 +rollout_issue_url: +group: group::continuous integration type: development default_enabled: true diff --git a/config/feature_flags/development/ci_build_metadata_config.yml b/config/feature_flags/development/ci_build_metadata_config.yml index add7c963272..176abbfd387 100644 --- a/config/feature_flags/development/ci_build_metadata_config.yml +++ b/config/feature_flags/development/ci_build_metadata_config.yml @@ -1,7 +1,7 @@ --- name: ci_build_metadata_config -introduced_by_url: -rollout_issue_url: -group: +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/7238 +rollout_issue_url: +group: group::continuous integration type: development default_enabled: false diff --git a/config/feature_flags/development/ci_enable_live_trace.yml b/config/feature_flags/development/ci_enable_live_trace.yml index e9fd998f6df..7ae59946330 100644 --- a/config/feature_flags/development/ci_enable_live_trace.yml +++ b/config/feature_flags/development/ci_enable_live_trace.yml @@ -1,7 +1,7 @@ --- name: ci_enable_live_trace -introduced_by_url: -rollout_issue_url: -group: +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/5255 +rollout_issue_url: +group: group::continuous integration type: development default_enabled: false diff --git a/config/feature_flags/development/ci_pipeline_latest.yml b/config/feature_flags/development/ci_pipeline_latest.yml index 661d0714e53..87b064043a3 100644 --- a/config/feature_flags/development/ci_pipeline_latest.yml +++ b/config/feature_flags/development/ci_pipeline_latest.yml @@ -1,7 +1,7 @@ --- name: ci_pipeline_latest -introduced_by_url: -rollout_issue_url: -group: +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/34160 +rollout_issue_url: +group: group::continuous integration type: development default_enabled: true diff --git a/config/feature_flags/development/packages_coming_soon.yml b/config/feature_flags/development/packages_coming_soon.yml deleted file mode 100644 index 0a0d1f989dc..00000000000 --- a/config/feature_flags/development/packages_coming_soon.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -name: packages_coming_soon -introduced_by_url: -rollout_issue_url: -group: -type: development -default_enabled: false diff --git a/config/feature_flags/ops/ci_trace_log_invalid_chunks.yml b/config/feature_flags/ops/ci_trace_log_invalid_chunks.yml new file mode 100644 index 00000000000..f5e8bbae258 --- /dev/null +++ b/config/feature_flags/ops/ci_trace_log_invalid_chunks.yml @@ -0,0 +1,7 @@ +--- +name: ci_trace_log_invalid_chunks +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44409 +rollout_issue_url: +type: ops +group: group::continuous integration +default_enabled: false diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml index 14580e2bb3b..5e5fc5f9af7 100644 --- a/config/locales/devise.en.yml +++ b/config/locales/devise.en.yml @@ -18,6 +18,7 @@ en: unconfirmed: "You have to confirm your email address before continuing. Please check your email for the link we sent you, or click 'Resend confirmation email'." blocked: "Your account has been blocked. Please contact your GitLab administrator if you think this is an error." forbidden: "Your account does not have the required permission to login. Please contact your GitLab administrator if you think this is an error." + blocked_pending_approval: "Your account is pending approval from your GitLab administrator and hence blocked. Please contact your GitLab administrator if you think this is an error." mailer: confirmation_instructions: subject: "Confirmation instructions" diff --git a/db/migrate/20200226100624_requirements_add_project_fk.rb b/db/migrate/20200226100624_requirements_add_project_fk.rb index 7c133e820f3..b44ce1d34ec 100644 --- a/db/migrate/20200226100624_requirements_add_project_fk.rb +++ b/db/migrate/20200226100624_requirements_add_project_fk.rb @@ -7,7 +7,7 @@ class RequirementsAddProjectFk < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key(:requirements, :projects, column: :project_id, on_delete: :cascade) # rubocop: disable Migration/AddConcurrentForeignKey + add_foreign_key(:requirements, :projects, column: :project_id, on_delete: :cascade) end end diff --git a/db/migrate/20200226100634_requirements_add_author_fk.rb b/db/migrate/20200226100634_requirements_add_author_fk.rb index 8e1a726bb76..b458657827f 100644 --- a/db/migrate/20200226100634_requirements_add_author_fk.rb +++ b/db/migrate/20200226100634_requirements_add_author_fk.rb @@ -7,7 +7,7 @@ class RequirementsAddAuthorFk < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key(:requirements, :users, column: :author_id, on_delete: :nullify) # rubocop: disable Migration/AddConcurrentForeignKey + add_foreign_key(:requirements, :users, column: :author_id, on_delete: :nullify) end end diff --git a/db/migrate/20200304121828_add_ci_sources_project_pipeline_foreign_key.rb b/db/migrate/20200304121828_add_ci_sources_project_pipeline_foreign_key.rb index d5b0af41d4a..ed244a7d308 100644 --- a/db/migrate/20200304121828_add_ci_sources_project_pipeline_foreign_key.rb +++ b/db/migrate/20200304121828_add_ci_sources_project_pipeline_foreign_key.rb @@ -7,7 +7,7 @@ class AddCiSourcesProjectPipelineForeignKey < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :ci_sources_projects, :ci_pipelines, column: :pipeline_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :ci_sources_projects, :ci_pipelines, column: :pipeline_id, on_delete: :cascade end end diff --git a/db/migrate/20200304121844_add_ci_sources_project_source_project_foreign_key.rb b/db/migrate/20200304121844_add_ci_sources_project_source_project_foreign_key.rb index 4f679bef85e..56ae2106644 100644 --- a/db/migrate/20200304121844_add_ci_sources_project_source_project_foreign_key.rb +++ b/db/migrate/20200304121844_add_ci_sources_project_source_project_foreign_key.rb @@ -7,7 +7,7 @@ class AddCiSourcesProjectSourceProjectForeignKey < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :ci_sources_projects, :projects, column: :source_project_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :ci_sources_projects, :projects, column: :source_project_id, on_delete: :cascade end end diff --git a/db/migrate/20200316173312_add_vulnerability_export_project_foreign_key.rb b/db/migrate/20200316173312_add_vulnerability_export_project_foreign_key.rb index 23837f559d2..84b96c64658 100644 --- a/db/migrate/20200316173312_add_vulnerability_export_project_foreign_key.rb +++ b/db/migrate/20200316173312_add_vulnerability_export_project_foreign_key.rb @@ -7,7 +7,7 @@ class AddVulnerabilityExportProjectForeignKey < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :vulnerability_exports, :projects, column: :project_id, on_delete: :cascade, index: false # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :vulnerability_exports, :projects, column: :project_id, on_delete: :cascade, index: false end end diff --git a/db/migrate/20200317142110_add_vulnerability_export_user_foreign_key.rb b/db/migrate/20200317142110_add_vulnerability_export_user_foreign_key.rb index 032577f2f2a..c4f685701b9 100644 --- a/db/migrate/20200317142110_add_vulnerability_export_user_foreign_key.rb +++ b/db/migrate/20200317142110_add_vulnerability_export_user_foreign_key.rb @@ -7,7 +7,7 @@ class AddVulnerabilityExportUserForeignKey < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :vulnerability_exports, :users, column: :author_id, on_delete: :cascade, index: false # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :vulnerability_exports, :users, column: :author_id, on_delete: :cascade, index: false end end diff --git a/db/migrate/20200326124443_add_projects_fk_to_jira_imports_table.rb b/db/migrate/20200326124443_add_projects_fk_to_jira_imports_table.rb index 6410f530b30..654d35619e3 100644 --- a/db/migrate/20200326124443_add_projects_fk_to_jira_imports_table.rb +++ b/db/migrate/20200326124443_add_projects_fk_to_jira_imports_table.rb @@ -7,7 +7,7 @@ class AddProjectsFkToJiraImportsTable < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :jira_imports, :projects, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :jira_imports, :projects, on_delete: :cascade end end diff --git a/db/migrate/20200326134443_add_users_fk_to_jira_imports_table.rb b/db/migrate/20200326134443_add_users_fk_to_jira_imports_table.rb index 0956a8e814b..429f72628e2 100644 --- a/db/migrate/20200326134443_add_users_fk_to_jira_imports_table.rb +++ b/db/migrate/20200326134443_add_users_fk_to_jira_imports_table.rb @@ -7,7 +7,7 @@ class AddUsersFkToJiraImportsTable < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :jira_imports, :users, on_delete: :nullify # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :jira_imports, :users, on_delete: :nullify end end diff --git a/db/migrate/20200326144443_add_labels_fk_to_jira_imports_table.rb b/db/migrate/20200326144443_add_labels_fk_to_jira_imports_table.rb index ead04100a96..9bcadcb61c1 100644 --- a/db/migrate/20200326144443_add_labels_fk_to_jira_imports_table.rb +++ b/db/migrate/20200326144443_add_labels_fk_to_jira_imports_table.rb @@ -7,7 +7,7 @@ class AddLabelsFkToJiraImportsTable < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :jira_imports, :labels, on_delete: :nullify # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :jira_imports, :labels, on_delete: :nullify end end diff --git a/db/migrate/20200416120354_add_locked_by_user_id_foreign_key_to_terraform_state.rb b/db/migrate/20200416120354_add_locked_by_user_id_foreign_key_to_terraform_state.rb index ecee028351a..144291d94be 100644 --- a/db/migrate/20200416120354_add_locked_by_user_id_foreign_key_to_terraform_state.rb +++ b/db/migrate/20200416120354_add_locked_by_user_id_foreign_key_to_terraform_state.rb @@ -7,7 +7,7 @@ class AddLockedByUserIdForeignKeyToTerraformState < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :terraform_states, :users, column: :locked_by_user_id # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :terraform_states, :users, column: :locked_by_user_id end end diff --git a/db/migrate/20200423075720_add_user_id_foreign_key_to_resource_state_events.rb b/db/migrate/20200423075720_add_user_id_foreign_key_to_resource_state_events.rb index 702347e5d43..91a6dbe4214 100644 --- a/db/migrate/20200423075720_add_user_id_foreign_key_to_resource_state_events.rb +++ b/db/migrate/20200423075720_add_user_id_foreign_key_to_resource_state_events.rb @@ -7,7 +7,7 @@ class AddUserIdForeignKeyToResourceStateEvents < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :resource_state_events, :users, column: :user_id, on_delete: :nullify # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :resource_state_events, :users, column: :user_id, on_delete: :nullify end end diff --git a/db/migrate/20200423080334_add_issue_id_foreign_key_to_resource_state_events.rb b/db/migrate/20200423080334_add_issue_id_foreign_key_to_resource_state_events.rb index 660c51eb3a6..b9f0fdeaa16 100644 --- a/db/migrate/20200423080334_add_issue_id_foreign_key_to_resource_state_events.rb +++ b/db/migrate/20200423080334_add_issue_id_foreign_key_to_resource_state_events.rb @@ -7,7 +7,7 @@ class AddIssueIdForeignKeyToResourceStateEvents < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :resource_state_events, :issues, column: :issue_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :resource_state_events, :issues, column: :issue_id, on_delete: :cascade end end diff --git a/db/migrate/20200423080607_add_merge_request_id_foreign_key_to_resource_state_events.rb b/db/migrate/20200423080607_add_merge_request_id_foreign_key_to_resource_state_events.rb index 4f0a689a992..3c070984f9e 100644 --- a/db/migrate/20200423080607_add_merge_request_id_foreign_key_to_resource_state_events.rb +++ b/db/migrate/20200423080607_add_merge_request_id_foreign_key_to_resource_state_events.rb @@ -7,7 +7,7 @@ class AddMergeRequestIdForeignKeyToResourceStateEvents < ActiveRecord::Migration def up with_lock_retries do - add_foreign_key :resource_state_events, :merge_requests, column: :merge_request_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :resource_state_events, :merge_requests, column: :merge_request_id, on_delete: :cascade end end diff --git a/db/migrate/20200429015603_add_fk_to_project_repository_storage_moves.rb b/db/migrate/20200429015603_add_fk_to_project_repository_storage_moves.rb index a68ce66e4a6..166ce320a23 100644 --- a/db/migrate/20200429015603_add_fk_to_project_repository_storage_moves.rb +++ b/db/migrate/20200429015603_add_fk_to_project_repository_storage_moves.rb @@ -7,7 +7,7 @@ class AddFkToProjectRepositoryStorageMoves < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :project_repository_storage_moves, :projects, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :project_repository_storage_moves, :projects, on_delete: :cascade end end diff --git a/db/migrate/20200510183128_add_foreign_key_from_webauthn_registrations_to_users.rb b/db/migrate/20200510183128_add_foreign_key_from_webauthn_registrations_to_users.rb index f71a5276dee..9071e3e17e3 100644 --- a/db/migrate/20200510183128_add_foreign_key_from_webauthn_registrations_to_users.rb +++ b/db/migrate/20200510183128_add_foreign_key_from_webauthn_registrations_to_users.rb @@ -9,7 +9,7 @@ class AddForeignKeyFromWebauthnRegistrationsToUsers < ActiveRecord::Migration[6. def up with_lock_retries do - add_foreign_key :webauthn_registrations, :users, column: :user_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :webauthn_registrations, :users, column: :user_id, on_delete: :cascade end end diff --git a/db/migrate/20200511092505_add_foreign_key_to_epic_id_on_resource_state_events.rb b/db/migrate/20200511092505_add_foreign_key_to_epic_id_on_resource_state_events.rb index 8072fe81c4a..1daa620501a 100644 --- a/db/migrate/20200511092505_add_foreign_key_to_epic_id_on_resource_state_events.rb +++ b/db/migrate/20200511092505_add_foreign_key_to_epic_id_on_resource_state_events.rb @@ -7,7 +7,7 @@ class AddForeignKeyToEpicIdOnResourceStateEvents < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :resource_state_events, :epics, column: :epic_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :resource_state_events, :epics, column: :epic_id, on_delete: :cascade end end diff --git a/db/migrate/20200511121549_add_group_wiki_repositories_shard_id_foreign_key.rb b/db/migrate/20200511121549_add_group_wiki_repositories_shard_id_foreign_key.rb index c2606dfb0d5..d1bb3fcc6ea 100644 --- a/db/migrate/20200511121549_add_group_wiki_repositories_shard_id_foreign_key.rb +++ b/db/migrate/20200511121549_add_group_wiki_repositories_shard_id_foreign_key.rb @@ -7,7 +7,7 @@ class AddGroupWikiRepositoriesShardIdForeignKey < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :group_wiki_repositories, :shards, on_delete: :restrict # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :group_wiki_repositories, :shards, on_delete: :restrict end end diff --git a/db/migrate/20200511121610_add_group_wiki_repositories_group_id_foreign_key.rb b/db/migrate/20200511121610_add_group_wiki_repositories_group_id_foreign_key.rb index 3a4c75be3b9..40f272cc0e7 100644 --- a/db/migrate/20200511121610_add_group_wiki_repositories_group_id_foreign_key.rb +++ b/db/migrate/20200511121610_add_group_wiki_repositories_group_id_foreign_key.rb @@ -7,7 +7,7 @@ class AddGroupWikiRepositoriesGroupIdForeignKey < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :group_wiki_repositories, :namespaces, column: :group_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :group_wiki_repositories, :namespaces, column: :group_id, on_delete: :cascade end end diff --git a/db/migrate/20200511191027_add_author_foreign_key_to_test_reports.rb b/db/migrate/20200511191027_add_author_foreign_key_to_test_reports.rb index a9fbee388c5..532133fe7f9 100644 --- a/db/migrate/20200511191027_add_author_foreign_key_to_test_reports.rb +++ b/db/migrate/20200511191027_add_author_foreign_key_to_test_reports.rb @@ -7,7 +7,7 @@ class AddAuthorForeignKeyToTestReports < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :requirements_management_test_reports, :users, column: :author_id, on_delete: :nullify # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :requirements_management_test_reports, :users, column: :author_id, on_delete: :nullify end end diff --git a/db/migrate/20200511208012_add_pipeline_foreign_key_to_test_reports.rb b/db/migrate/20200511208012_add_pipeline_foreign_key_to_test_reports.rb index 2b9b3464580..46657f9af6d 100644 --- a/db/migrate/20200511208012_add_pipeline_foreign_key_to_test_reports.rb +++ b/db/migrate/20200511208012_add_pipeline_foreign_key_to_test_reports.rb @@ -7,7 +7,7 @@ class AddPipelineForeignKeyToTestReports < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :requirements_management_test_reports, :ci_pipelines, column: :pipeline_id, on_delete: :nullify # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :requirements_management_test_reports, :ci_pipelines, column: :pipeline_id, on_delete: :nullify end end diff --git a/db/migrate/20200521225337_add_foreign_key_to_user_id_on_alert_management_alert_assignees.rb b/db/migrate/20200521225337_add_foreign_key_to_user_id_on_alert_management_alert_assignees.rb index 9d97c68f78f..4a6a25a8472 100644 --- a/db/migrate/20200521225337_add_foreign_key_to_user_id_on_alert_management_alert_assignees.rb +++ b/db/migrate/20200521225337_add_foreign_key_to_user_id_on_alert_management_alert_assignees.rb @@ -7,7 +7,7 @@ class AddForeignKeyToUserIdOnAlertManagementAlertAssignees < ActiveRecord::Migra def up with_lock_retries do - add_foreign_key :alert_management_alert_assignees, :users, column: :user_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :alert_management_alert_assignees, :users, column: :user_id, on_delete: :cascade end end diff --git a/db/migrate/20200521225346_add_foreign_key_to_alert_id_on_alert_mangagement_alert_assignees.rb b/db/migrate/20200521225346_add_foreign_key_to_alert_id_on_alert_mangagement_alert_assignees.rb index 1d6197edef9..77d374f08fa 100644 --- a/db/migrate/20200521225346_add_foreign_key_to_alert_id_on_alert_mangagement_alert_assignees.rb +++ b/db/migrate/20200521225346_add_foreign_key_to_alert_id_on_alert_mangagement_alert_assignees.rb @@ -7,7 +7,7 @@ class AddForeignKeyToAlertIdOnAlertMangagementAlertAssignees < ActiveRecord::Mig def up with_lock_retries do - add_foreign_key :alert_management_alert_assignees, :alert_management_alerts, column: :alert_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :alert_management_alert_assignees, :alert_management_alerts, column: :alert_id, on_delete: :cascade end end diff --git a/db/migrate/20200526164947_add_foreign_key_to_ops_feature_flags_issues.rb b/db/migrate/20200526164947_add_foreign_key_to_ops_feature_flags_issues.rb index 1cad53cb371..a11a8094823 100644 --- a/db/migrate/20200526164947_add_foreign_key_to_ops_feature_flags_issues.rb +++ b/db/migrate/20200526164947_add_foreign_key_to_ops_feature_flags_issues.rb @@ -7,7 +7,7 @@ class AddForeignKeyToOpsFeatureFlagsIssues < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :operations_feature_flags_issues, :issues, column: :issue_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :operations_feature_flags_issues, :issues, column: :issue_id, on_delete: :cascade end end diff --git a/db/migrate/20200527135313_add_requirements_build_reference.rb b/db/migrate/20200527135313_add_requirements_build_reference.rb index 3385243fbdd..b492871a19b 100644 --- a/db/migrate/20200527135313_add_requirements_build_reference.rb +++ b/db/migrate/20200527135313_add_requirements_build_reference.rb @@ -11,7 +11,7 @@ class AddRequirementsBuildReference < ActiveRecord::Migration[6.0] add_index :requirements_management_test_reports, :build_id, name: INDEX_NAME # rubocop:disable Migration/AddIndex with_lock_retries do - add_foreign_key :requirements_management_test_reports, :ci_builds, column: :build_id, on_delete: :nullify # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :requirements_management_test_reports, :ci_builds, column: :build_id, on_delete: :nullify end end diff --git a/db/migrate/20200527152116_add_foreign_key_to_build_id_on_build_report_results.rb b/db/migrate/20200527152116_add_foreign_key_to_build_id_on_build_report_results.rb index 1c41389b15b..1809fed551a 100644 --- a/db/migrate/20200527152116_add_foreign_key_to_build_id_on_build_report_results.rb +++ b/db/migrate/20200527152116_add_foreign_key_to_build_id_on_build_report_results.rb @@ -7,7 +7,7 @@ class AddForeignKeyToBuildIdOnBuildReportResults < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :ci_build_report_results, :ci_builds, column: :build_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :ci_build_report_results, :ci_builds, column: :build_id, on_delete: :cascade end end diff --git a/db/migrate/20200527152657_add_foreign_key_to_project_id_on_build_report_results.rb b/db/migrate/20200527152657_add_foreign_key_to_project_id_on_build_report_results.rb index da870722bc3..1857cb07b06 100644 --- a/db/migrate/20200527152657_add_foreign_key_to_project_id_on_build_report_results.rb +++ b/db/migrate/20200527152657_add_foreign_key_to_project_id_on_build_report_results.rb @@ -7,7 +7,7 @@ class AddForeignKeyToProjectIdOnBuildReportResults < ActiveRecord::Migration[6.0 def up with_lock_retries do - add_foreign_key :ci_build_report_results, :projects, column: :project_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :ci_build_report_results, :projects, column: :project_id, on_delete: :cascade end end diff --git a/db/migrate/20200604174544_add_users_foreign_key_to_board_user_preferences.rb b/db/migrate/20200604174544_add_users_foreign_key_to_board_user_preferences.rb index 8f60c41a9c7..cc613e0261e 100644 --- a/db/migrate/20200604174544_add_users_foreign_key_to_board_user_preferences.rb +++ b/db/migrate/20200604174544_add_users_foreign_key_to_board_user_preferences.rb @@ -7,7 +7,7 @@ class AddUsersForeignKeyToBoardUserPreferences < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :board_user_preferences, :users, column: :user_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :board_user_preferences, :users, column: :user_id, on_delete: :cascade end end diff --git a/db/migrate/20200604174558_add_boards_foreign_key_to_board_user_preferences.rb b/db/migrate/20200604174558_add_boards_foreign_key_to_board_user_preferences.rb index a18f0eac505..4ac978d3741 100644 --- a/db/migrate/20200604174558_add_boards_foreign_key_to_board_user_preferences.rb +++ b/db/migrate/20200604174558_add_boards_foreign_key_to_board_user_preferences.rb @@ -7,7 +7,7 @@ class AddBoardsForeignKeyToBoardUserPreferences < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :board_user_preferences, :boards, column: :board_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :board_user_preferences, :boards, column: :board_id, on_delete: :cascade end end diff --git a/db/migrate/20200605003204_add_foreign_key_to_alert_management_alert_user_mentions.rb b/db/migrate/20200605003204_add_foreign_key_to_alert_management_alert_user_mentions.rb index 35a250521a6..3198544d3a9 100644 --- a/db/migrate/20200605003204_add_foreign_key_to_alert_management_alert_user_mentions.rb +++ b/db/migrate/20200605003204_add_foreign_key_to_alert_management_alert_user_mentions.rb @@ -7,7 +7,7 @@ class AddForeignKeyToAlertManagementAlertUserMentions < ActiveRecord::Migration[ def up with_lock_retries do - add_foreign_key :alert_management_alert_user_mentions, :notes, column: :note_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :alert_management_alert_user_mentions, :notes, column: :note_id, on_delete: :cascade end end diff --git a/db/migrate/20200623073431_add_source_merge_request_id_to_resource_state_events.rb b/db/migrate/20200623073431_add_source_merge_request_id_to_resource_state_events.rb index 8970797d3c0..01d0d8ce1d4 100644 --- a/db/migrate/20200623073431_add_source_merge_request_id_to_resource_state_events.rb +++ b/db/migrate/20200623073431_add_source_merge_request_id_to_resource_state_events.rb @@ -20,7 +20,7 @@ class AddSourceMergeRequestIdToResourceStateEvents < ActiveRecord::Migration[6.0 unless foreign_key_exists?(:resource_state_events, :merge_requests, column: :source_merge_request_id) with_lock_retries do - add_foreign_key :resource_state_events, :merge_requests, column: :source_merge_request_id, on_delete: :nullify # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :resource_state_events, :merge_requests, column: :source_merge_request_id, on_delete: :nullify end end end diff --git a/db/migrate/20200722132040_add_users_fk_to_resource_iteration_events_table.rb b/db/migrate/20200722132040_add_users_fk_to_resource_iteration_events_table.rb index e28405be53d..c3d95c9dfc2 100644 --- a/db/migrate/20200722132040_add_users_fk_to_resource_iteration_events_table.rb +++ b/db/migrate/20200722132040_add_users_fk_to_resource_iteration_events_table.rb @@ -7,7 +7,7 @@ class AddUsersFkToResourceIterationEventsTable < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :resource_iteration_events, :users, column: :user_id, on_delete: :nullify # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :resource_iteration_events, :users, column: :user_id, on_delete: :nullify end end diff --git a/db/migrate/20200722132540_add_issues_fk_to_resource_iteration_events_table.rb b/db/migrate/20200722132540_add_issues_fk_to_resource_iteration_events_table.rb index adb10aaa707..b603f14f62b 100644 --- a/db/migrate/20200722132540_add_issues_fk_to_resource_iteration_events_table.rb +++ b/db/migrate/20200722132540_add_issues_fk_to_resource_iteration_events_table.rb @@ -7,7 +7,7 @@ class AddIssuesFkToResourceIterationEventsTable < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :resource_iteration_events, :issues, column: :issue_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :resource_iteration_events, :issues, column: :issue_id, on_delete: :cascade end end diff --git a/db/migrate/20200722133040_add_merge_requests_fk_to_resource_iteration_events_table.rb b/db/migrate/20200722133040_add_merge_requests_fk_to_resource_iteration_events_table.rb index 8b1859bb253..e047b157a53 100644 --- a/db/migrate/20200722133040_add_merge_requests_fk_to_resource_iteration_events_table.rb +++ b/db/migrate/20200722133040_add_merge_requests_fk_to_resource_iteration_events_table.rb @@ -7,7 +7,7 @@ class AddMergeRequestsFkToResourceIterationEventsTable < ActiveRecord::Migration def up with_lock_retries do - add_foreign_key :resource_iteration_events, :merge_requests, column: :merge_request_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :resource_iteration_events, :merge_requests, column: :merge_request_id, on_delete: :cascade end end diff --git a/db/migrate/20200722133540_add_iterations_fk_to_resource_iteration_events_table.rb b/db/migrate/20200722133540_add_iterations_fk_to_resource_iteration_events_table.rb index b42c29a0634..1bb3ac7c8bd 100644 --- a/db/migrate/20200722133540_add_iterations_fk_to_resource_iteration_events_table.rb +++ b/db/migrate/20200722133540_add_iterations_fk_to_resource_iteration_events_table.rb @@ -7,7 +7,7 @@ class AddIterationsFkToResourceIterationEventsTable < ActiveRecord::Migration[6. def up with_lock_retries do - add_foreign_key :resource_iteration_events, :sprints, column: :iteration_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :resource_iteration_events, :sprints, column: :iteration_id, on_delete: :cascade end end diff --git a/db/migrate/20200731201408_add_foreign_key_to_experiment_on_experiment_users.rb b/db/migrate/20200731201408_add_foreign_key_to_experiment_on_experiment_users.rb index 3961803bf52..c1a6dae242b 100644 --- a/db/migrate/20200731201408_add_foreign_key_to_experiment_on_experiment_users.rb +++ b/db/migrate/20200731201408_add_foreign_key_to_experiment_on_experiment_users.rb @@ -8,7 +8,7 @@ class AddForeignKeyToExperimentOnExperimentUsers < ActiveRecord::Migration[6.0] def up with_lock_retries do # There is no need to use add_concurrent_foreign_key since it's an empty table - add_foreign_key :experiment_users, :experiments, column: :experiment_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :experiment_users, :experiments, column: :experiment_id, on_delete: :cascade end end diff --git a/db/migrate/20200731201834_add_foreign_key_to_user_on_experiment_users.rb b/db/migrate/20200731201834_add_foreign_key_to_user_on_experiment_users.rb index 42c337fecff..673a0bde0b1 100644 --- a/db/migrate/20200731201834_add_foreign_key_to_user_on_experiment_users.rb +++ b/db/migrate/20200731201834_add_foreign_key_to_user_on_experiment_users.rb @@ -8,7 +8,7 @@ class AddForeignKeyToUserOnExperimentUsers < ActiveRecord::Migration[6.0] def up with_lock_retries do # There is no need to use add_concurrent_foreign_key since it's an empty table - add_foreign_key :experiment_users, :users, column: :user_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :experiment_users, :users, column: :user_id, on_delete: :cascade end end diff --git a/db/migrate/20200805151001_add_foreign_key_to_pipeline_id_on_pipeline_artifact.rb b/db/migrate/20200805151001_add_foreign_key_to_pipeline_id_on_pipeline_artifact.rb index d6c3a4fe742..5cfe0496b8d 100644 --- a/db/migrate/20200805151001_add_foreign_key_to_pipeline_id_on_pipeline_artifact.rb +++ b/db/migrate/20200805151001_add_foreign_key_to_pipeline_id_on_pipeline_artifact.rb @@ -7,7 +7,7 @@ class AddForeignKeyToPipelineIdOnPipelineArtifact < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :ci_pipeline_artifacts, :ci_pipelines, column: :pipeline_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :ci_pipeline_artifacts, :ci_pipelines, column: :pipeline_id, on_delete: :cascade end end diff --git a/db/migrate/20200805151726_add_foreign_key_to_project_id_on_pipeline_artifact.rb b/db/migrate/20200805151726_add_foreign_key_to_project_id_on_pipeline_artifact.rb index 367a2774d62..fe418f4c5af 100644 --- a/db/migrate/20200805151726_add_foreign_key_to_project_id_on_pipeline_artifact.rb +++ b/db/migrate/20200805151726_add_foreign_key_to_project_id_on_pipeline_artifact.rb @@ -7,7 +7,7 @@ class AddForeignKeyToProjectIdOnPipelineArtifact < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :ci_pipeline_artifacts, :projects, column: :project_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :ci_pipeline_artifacts, :projects, column: :project_id, on_delete: :cascade end end diff --git a/db/migrate/20200825081035_boards_epic_user_preferences_fk_board.rb b/db/migrate/20200825081035_boards_epic_user_preferences_fk_board.rb index eb52cadaecf..1c014573fb4 100644 --- a/db/migrate/20200825081035_boards_epic_user_preferences_fk_board.rb +++ b/db/migrate/20200825081035_boards_epic_user_preferences_fk_board.rb @@ -7,7 +7,7 @@ class BoardsEpicUserPreferencesFkBoard < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :boards_epic_user_preferences, :boards, column: :board_id, on_delete: :cascade # rubocop: disable Migration/AddConcurrentForeignKey + add_foreign_key :boards_epic_user_preferences, :boards, column: :board_id, on_delete: :cascade end end diff --git a/db/migrate/20200825081045_boards_epic_user_preferences_fk_user.rb b/db/migrate/20200825081045_boards_epic_user_preferences_fk_user.rb index 98d0a5b64f6..3edc3bc0ded 100644 --- a/db/migrate/20200825081045_boards_epic_user_preferences_fk_user.rb +++ b/db/migrate/20200825081045_boards_epic_user_preferences_fk_user.rb @@ -7,7 +7,7 @@ class BoardsEpicUserPreferencesFkUser < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :boards_epic_user_preferences, :users, column: :user_id, on_delete: :cascade # rubocop: disable Migration/AddConcurrentForeignKey + add_foreign_key :boards_epic_user_preferences, :users, column: :user_id, on_delete: :cascade end end diff --git a/db/migrate/20200825081055_boards_epic_user_preferences_fk_epic.rb b/db/migrate/20200825081055_boards_epic_user_preferences_fk_epic.rb index 46498f186c4..0354060b7c1 100644 --- a/db/migrate/20200825081055_boards_epic_user_preferences_fk_epic.rb +++ b/db/migrate/20200825081055_boards_epic_user_preferences_fk_epic.rb @@ -7,7 +7,7 @@ class BoardsEpicUserPreferencesFkEpic < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :boards_epic_user_preferences, :epics, column: :epic_id, on_delete: :cascade # rubocop: disable Migration/AddConcurrentForeignKey + add_foreign_key :boards_epic_user_preferences, :epics, column: :epic_id, on_delete: :cascade end end diff --git a/db/migrate/20200827060911_add_merge_request_foreign_key_to_merge_request_reviewers.rb b/db/migrate/20200827060911_add_merge_request_foreign_key_to_merge_request_reviewers.rb index dc3356375fd..73d0eea9819 100644 --- a/db/migrate/20200827060911_add_merge_request_foreign_key_to_merge_request_reviewers.rb +++ b/db/migrate/20200827060911_add_merge_request_foreign_key_to_merge_request_reviewers.rb @@ -10,7 +10,7 @@ class AddMergeRequestForeignKeyToMergeRequestReviewers < ActiveRecord::Migration def up with_lock_retries do - add_foreign_key :merge_request_reviewers, :merge_requests, column: :merge_request_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :merge_request_reviewers, :merge_requests, column: :merge_request_id, on_delete: :cascade end end diff --git a/db/migrate/20200827060932_add_user_foreign_key_to_merge_request_reviewers.rb b/db/migrate/20200827060932_add_user_foreign_key_to_merge_request_reviewers.rb index d6c6985a668..5463c3d9846 100644 --- a/db/migrate/20200827060932_add_user_foreign_key_to_merge_request_reviewers.rb +++ b/db/migrate/20200827060932_add_user_foreign_key_to_merge_request_reviewers.rb @@ -10,7 +10,7 @@ class AddUserForeignKeyToMergeRequestReviewers < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :merge_request_reviewers, :users, column: :user_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :merge_request_reviewers, :users, column: :user_id, on_delete: :cascade end end diff --git a/db/migrate/20200828155134_add_foreign_key_on_scan_id_to_security_scans.rb b/db/migrate/20200828155134_add_foreign_key_on_scan_id_to_security_scans.rb index 612bd79a282..9d815cc75dc 100644 --- a/db/migrate/20200828155134_add_foreign_key_on_scan_id_to_security_scans.rb +++ b/db/migrate/20200828155134_add_foreign_key_on_scan_id_to_security_scans.rb @@ -7,7 +7,7 @@ class AddForeignKeyOnScanIdToSecurityScans < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :security_findings, :security_scans, column: :scan_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :security_findings, :security_scans, column: :scan_id, on_delete: :cascade end end diff --git a/db/migrate/20200828155205_add_foreign_key_on_scanner_id_to_vulnerability_scanners.rb b/db/migrate/20200828155205_add_foreign_key_on_scanner_id_to_vulnerability_scanners.rb index eb3e878c8be..015e83b59b1 100644 --- a/db/migrate/20200828155205_add_foreign_key_on_scanner_id_to_vulnerability_scanners.rb +++ b/db/migrate/20200828155205_add_foreign_key_on_scanner_id_to_vulnerability_scanners.rb @@ -7,7 +7,7 @@ class AddForeignKeyOnScannerIdToVulnerabilityScanners < ActiveRecord::Migration[ def up with_lock_retries do - add_foreign_key :security_findings, :vulnerability_scanners, column: :scanner_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :security_findings, :vulnerability_scanners, column: :scanner_id, on_delete: :cascade end end diff --git a/db/migrate/20200911121027_add_pages_deployment_project_foreign_key.rb b/db/migrate/20200911121027_add_pages_deployment_project_foreign_key.rb index 70418881c4f..665b9de9230 100644 --- a/db/migrate/20200911121027_add_pages_deployment_project_foreign_key.rb +++ b/db/migrate/20200911121027_add_pages_deployment_project_foreign_key.rb @@ -7,7 +7,7 @@ class AddPagesDeploymentProjectForeignKey < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :pages_deployments, :projects, column: :project_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :pages_deployments, :projects, column: :project_id, on_delete: :cascade end end diff --git a/db/migrate/20200911121048_add_pages_deployment_ci_build_foreign_key.rb b/db/migrate/20200911121048_add_pages_deployment_ci_build_foreign_key.rb index ece721d88d5..83f38b2fae3 100644 --- a/db/migrate/20200911121048_add_pages_deployment_ci_build_foreign_key.rb +++ b/db/migrate/20200911121048_add_pages_deployment_ci_build_foreign_key.rb @@ -7,7 +7,7 @@ class AddPagesDeploymentCiBuildForeignKey < ActiveRecord::Migration[6.0] def up with_lock_retries do - add_foreign_key :pages_deployments, :ci_builds, column: :ci_build_id, on_delete: :nullify # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :pages_deployments, :ci_builds, column: :ci_build_id, on_delete: :nullify end end diff --git a/db/migrate/20200912193210_add_scheduling_issues_temp_indexes.rb b/db/migrate/20200912193210_add_scheduling_issues_temp_indexes.rb new file mode 100644 index 00000000000..bc2b8d4ce97 --- /dev/null +++ b/db/migrate/20200912193210_add_scheduling_issues_temp_indexes.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +class AddSchedulingIssuesTempIndexes < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + add_concurrent_index :issue_links, [:source_id], where: 'link_type = 1', name: 'tmp_idx_blocking_type_links' + add_concurrent_index :issue_links, [:target_id], where: 'link_type = 2', name: 'tmp_idx_blocked_by_type_links' + add_concurrent_index :issues, :id, where: '(state_id = 1 AND blocking_issues_count = 0)', name: 'tmp_idx_index_issues_with_outdate_blocking_count' + end + + def down + remove_concurrent_index_by_name(:issue_links, 'tmp_idx_blocking_type_links') + remove_concurrent_index_by_name(:issue_links, 'tmp_idx_blocked_by_type_links') + remove_concurrent_index_by_name(:issues, 'tmp_idx_index_issues_with_outdate_blocking_count') + end +end diff --git a/db/post_migrate/20200810191256_remove_pipeline_id_from_test_reports.rb b/db/post_migrate/20200810191256_remove_pipeline_id_from_test_reports.rb index 4a5e6942371..f99629a921e 100644 --- a/db/post_migrate/20200810191256_remove_pipeline_id_from_test_reports.rb +++ b/db/post_migrate/20200810191256_remove_pipeline_id_from_test_reports.rb @@ -13,9 +13,7 @@ class RemovePipelineIdFromTestReports < ActiveRecord::Migration[6.0] add_column :requirements_management_test_reports, :pipeline_id, :integer with_lock_retries do - # rubocop:disable Migration/AddConcurrentForeignKey add_foreign_key :requirements_management_test_reports, :ci_pipelines, column: :pipeline_id, on_delete: :nullify - # rubocop:enable Migration/AddConcurrentForeignKey end end end diff --git a/db/post_migrate/20200914185610_schedule_sync_blocking_issues_count.rb b/db/post_migrate/20200914185610_schedule_sync_blocking_issues_count.rb new file mode 100644 index 00000000000..74272cf5b39 --- /dev/null +++ b/db/post_migrate/20200914185610_schedule_sync_blocking_issues_count.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +class ScheduleSyncBlockingIssuesCount < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + BATCH_SIZE = 50 + DELAY_INTERVAL = 120.seconds.to_i + MIGRATION = 'SyncBlockingIssuesCount'.freeze + + disable_ddl_transaction! + + class Issue < ActiveRecord::Base + include EachBatch + + self.table_name = 'issues' + end + + def up + return unless Gitlab.ee? + + blocking_issues_ids = <<-SQL + SELECT issue_links.source_id AS blocking_issue_id + FROM issue_links + INNER JOIN issues ON issue_links.source_id = issues.id + WHERE issue_links.link_type = 1 + AND issues.state_id = 1 + AND issues.blocking_issues_count = 0 + UNION + SELECT issue_links.target_id AS blocking_issue_id + FROM issue_links + INNER JOIN issues ON issue_links.target_id = issues.id + WHERE issue_links.link_type = 2 + AND issues.state_id = 1 + AND issues.blocking_issues_count = 0 + SQL + + relation = + Issue.where("id IN(#{blocking_issues_ids})") # rubocop:disable GitlabSecurity/SqlInjection + + queue_background_migration_jobs_by_range_at_intervals( + relation, + MIGRATION, + DELAY_INTERVAL, + batch_size: BATCH_SIZE + ) + end + + def down + # no-op + end +end diff --git a/db/schema_migrations/20200912193210 b/db/schema_migrations/20200912193210 new file mode 100644 index 00000000000..a6ce007630a --- /dev/null +++ b/db/schema_migrations/20200912193210 @@ -0,0 +1 @@ +bcc84e89e4e9772d3209aa8df1368c188b1c6334114bcf339870cae74e724d01 \ No newline at end of file diff --git a/db/schema_migrations/20200914185610 b/db/schema_migrations/20200914185610 new file mode 100644 index 00000000000..a2bf098a7ac --- /dev/null +++ b/db/schema_migrations/20200914185610 @@ -0,0 +1 @@ +50cdb8d42baa0890b39ca7d07a4c157aea7d52a39dee48ee59e51417442eaaf4 \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index fbd33ecc19c..038fcd4120e 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -21755,6 +21755,12 @@ CREATE INDEX terraform_state_versions_verification_failure_partial ON terraform_ CREATE INDEX tmp_build_stage_position_index ON ci_builds USING btree (stage_id, stage_idx) WHERE (stage_idx IS NOT NULL); +CREATE INDEX tmp_idx_blocked_by_type_links ON issue_links USING btree (target_id) WHERE (link_type = 2); + +CREATE INDEX tmp_idx_blocking_type_links ON issue_links USING btree (source_id) WHERE (link_type = 1); + +CREATE INDEX tmp_idx_index_issues_with_outdate_blocking_count ON issues USING btree (id) WHERE ((state_id = 1) AND (blocking_issues_count = 0)); + CREATE INDEX tmp_index_for_email_unconfirmation_migration ON emails USING btree (id) WHERE (confirmed_at IS NOT NULL); CREATE UNIQUE INDEX unique_merge_request_metrics_by_merge_request_id ON merge_request_metrics USING btree (merge_request_id); diff --git a/doc/development/cicd/templates.md b/doc/development/cicd/templates.md index 77cedc9814e..aff4405dc51 100644 --- a/doc/development/cicd/templates.md +++ b/doc/development/cicd/templates.md @@ -13,15 +13,16 @@ This document explains how to develop [GitLab CI/CD templates](../../ci/examples All template files reside in the `lib/gitlab/ci/templates` directory, and are categorized by the following sub-directories: -| Sub-directory | Content | [Selectable in UI](#make-sure-the-new-template-can-be-selected-in-ui) | -|----------------|--------------------------------------------------------------|-----------------------------------------------------------------------| -| `/AWS/*` | Cloud Deployment (AWS) related jobs | No | -| `/Jobs/*` | Auto DevOps related jobs | No | -| `/Pages/*` | Static site generators for GitLab Pages (for example Jekyll) | Yes | -| `/Security/*` | Security related jobs | Yes | -| `/Verify/*` | Verify/testing related jobs | Yes | -| `/Workflows/*` | Common uses of the `workflow:` keyword | No | -| `/*` (root) | General templates | Yes | +| Sub-directory | Content | [Selectable in UI](#make-sure-the-new-template-can-be-selected-in-ui) | +|----------------|----------------------------------------------------|-----------------------------------------------------------------------| +| `/AWS/*` | Cloud Deployment (AWS) related jobs | No | +| `/Jobs/*` | Auto DevOps related jobs | No | +| `/Pages/*` | Static site generators for GitLab Pages (for example Jekyll) | Yes | +| `/Security/*` | Security related jobs | Yes | +| `/Terraform/*` | Infrastructure as Code related templates | No | +| `/Verify/*` | Verify/testing related jobs | Yes | +| `/Workflows/*` | Common uses of the `workflow:` keyword | No | +| `/*` (root) | General templates | Yes | ## Criteria diff --git a/doc/development/migration_style_guide.md b/doc/development/migration_style_guide.md index 48de6e53a85..268770193f9 100644 --- a/doc/development/migration_style_guide.md +++ b/doc/development/migration_style_guide.md @@ -300,7 +300,7 @@ include Gitlab::Database::MigrationHelpers def up with_lock_retries do - add_foreign_key :imports, :projects, column: :project_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :imports, :projects, column: :project_id, on_delete: :cascade end end @@ -318,7 +318,7 @@ include Gitlab::Database::MigrationHelpers def up with_lock_retries do - add_foreign_key :imports, :users, column: :user_id, on_delete: :cascade # rubocop:disable Migration/AddConcurrentForeignKey + add_foreign_key :imports, :users, column: :user_id, on_delete: :cascade end end diff --git a/doc/topics/autodevops/upgrading_postgresql.md b/doc/topics/autodevops/upgrading_postgresql.md index 2ebe362280f..bcbc1d914be 100644 --- a/doc/topics/autodevops/upgrading_postgresql.md +++ b/doc/topics/autodevops/upgrading_postgresql.md @@ -178,8 +178,11 @@ You can also PostgreSQL. 1. Set `AUTO_DEVOPS_POSTGRES_DELETE_V1` to a non-empty value. This flag is a safeguard to prevent accidental deletion of databases. -1. Set `POSTGRES_VERSION` to `11.7`. This is the minimum PostgreSQL - version supported. + +1. If you have a `POSTGRES_VERSION` set, make sure it is set to `9.6.16` *or +higher*. This is the + minimum PostgreSQL version supported by Auto DevOps. See also the list of + [tags available](https://hub.docker.com/r/bitnami/postgresql/tags). 1. Set `PRODUCTION_REPLICAS` to `0`. For other environments, use `REPLICAS` with an [environment scope](../../ci/environments/index.md#scoping-environments-with-specs). 1. If you have set the `DB_INITIALIZE` or `DB_MIGRATE` variables, either diff --git a/lib/gitlab/auth/user_access_denied_reason.rb b/lib/gitlab/auth/user_access_denied_reason.rb index cc4b8d887ff..36b54ba2e46 100644 --- a/lib/gitlab/auth/user_access_denied_reason.rb +++ b/lib/gitlab/auth/user_access_denied_reason.rb @@ -11,6 +11,8 @@ module Gitlab case rejection_type when :internal "This action cannot be performed by internal users" + when :blocked_pending_approval + "Your account is pending approval from your administrator and hence blocked." when :terms_not_accepted "You (#{@user.to_reference}) must accept the Terms of Service in order to perform this action. "\ "Please access GitLab from a web browser to accept these terms." @@ -31,6 +33,8 @@ module Gitlab def rejection_type if @user.internal? :internal + elsif @user.blocked_pending_approval? + :blocked_pending_approval elsif @user.required_terms_not_accepted? :terms_not_accepted elsif @user.deactivated? diff --git a/lib/gitlab/background_migration/sync_blocking_issues_count.rb b/lib/gitlab/background_migration/sync_blocking_issues_count.rb new file mode 100644 index 00000000000..6262320128c --- /dev/null +++ b/lib/gitlab/background_migration/sync_blocking_issues_count.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +# rubocop:disable Style/Documentation + +module Gitlab + module BackgroundMigration + class SyncBlockingIssuesCount + def perform(start_id, end_id) + end + end + end +end + +Gitlab::BackgroundMigration::SyncBlockingIssuesCount.prepend_if_ee('EE::Gitlab::BackgroundMigration::SyncBlockingIssuesCount') diff --git a/lib/gitlab/ci/features.rb b/lib/gitlab/ci/features.rb index e14d56af978..1a53cf614f9 100644 --- a/lib/gitlab/ci/features.rb +++ b/lib/gitlab/ci/features.rb @@ -59,6 +59,10 @@ module Gitlab ::Feature.enabled?(:ci_accept_trace, project, type: :ops, default_enabled: false) end + def self.log_invalid_trace_chunks?(project) + ::Feature.enabled?(:ci_trace_log_invalid_chunks, project, type: :ops, default_enabled: false) + end + def self.new_artifact_file_reader_enabled?(project) ::Feature.enabled?(:ci_new_artifact_file_reader, project, default_enabled: true) end diff --git a/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml new file mode 100644 index 00000000000..b08ccf18b58 --- /dev/null +++ b/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml @@ -0,0 +1,22 @@ +include: + - template: Terraform/Base.latest.gitlab-ci.yml # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml + +stages: + - init + - validate + - build + - deploy + +init: + extends: .init + +validate: + extends: .validate + +build: + extends: .build + +deploy: + extends: .deploy + dependencies: + - build diff --git a/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml b/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml new file mode 100644 index 00000000000..000a1a7f580 --- /dev/null +++ b/lib/gitlab/ci/templates/Terraform/Base.latest.gitlab-ci.yml @@ -0,0 +1,53 @@ +# Terraform/Base.latest +# +# The purpose of this template is to provide flexibility to the user so +# they are able to only include the jobs that they find interesting. +# +# Therefore, this template is not supposed to run any jobs. The idea is to only +# create hidden jobs. See: https://docs.gitlab.com/ee/ci/yaml/#hide-jobs +# +# There is a more opinionated template which we suggest the users to abide, +# which is the lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml + +image: + name: registry.gitlab.com/gitlab-org/terraform-images/stable:latest + +before_script: + - cd ${TF_ROOT} + +variables: + TF_ROOT: ${CI_PROJECT_DIR} + +cache: + key: "${TF_ROOT}" + paths: + - ${TF_ROOT}/.terraform/ + +.init: &init + stage: init + script: + - gitlab-terraform init + +.validate: &validate + stage: validate + script: + - gitlab-terraform validate + +.build: &build + stage: build + script: + - gitlab-terraform plan + - gitlab-terraform plan-json + artifacts: + paths: + - ${TF_ROOT}/plan.cache + reports: + terraform: ${TF_ROOT}/plan.json + +.deploy: &deploy + stage: deploy + script: + - gitlab-terraform apply + when: manual + only: + - master diff --git a/lib/gitlab/ci/trace/checksum.rb b/lib/gitlab/ci/trace/checksum.rb index b01136a6d24..62532ef1cd2 100644 --- a/lib/gitlab/ci/trace/checksum.rb +++ b/lib/gitlab/ci/trace/checksum.rb @@ -30,12 +30,14 @@ module Gitlab end def state_crc32 - strong_memoize(:crc32) { build.pending_state&.crc32 } + strong_memoize(:state_crc32) { build.pending_state&.crc32 } end def chunks_crc32 - trace_chunks.reduce(0) do |crc32, chunk| - Zlib.crc32_combine(crc32, chunk.crc32, chunk_size(chunk)) + strong_memoize(:chunks_crc32) do + trace_chunks.reduce(0) do |crc32, chunk| + Zlib.crc32_combine(crc32, chunk.crc32, chunk_size(chunk)) + end end end @@ -62,6 +64,10 @@ module Gitlab end end + def chunks_count + trace_chunks.to_a.size + end + private def chunk_size(chunk) diff --git a/lib/gitlab/database/batch_count.rb b/lib/gitlab/database/batch_count.rb index 0de67ed8cf0..11d9881aac2 100644 --- a/lib/gitlab/database/batch_count.rb +++ b/lib/gitlab/database/batch_count.rb @@ -86,14 +86,16 @@ module Gitlab batch_start = start while batch_start <= finish + batch_relation = build_relation_batch(batch_start, batch_start + batch_size, mode) begin - results = merge_results(results, batch_fetch(batch_start, batch_start + batch_size, mode)) + results = merge_results(results, batch_relation.send(@operation, *@operation_args)) # rubocop:disable GitlabSecurity/PublicSend batch_start += batch_size - rescue ActiveRecord::QueryCanceled + rescue ActiveRecord::QueryCanceled => error # retry with a safe batch size & warmer cache if batch_size >= 2 * MIN_REQUIRED_BATCH_SIZE batch_size /= 2 else + log_canceled_batch_fetch(batch_start, mode, batch_relation.to_sql, error) return FALLBACK end end @@ -113,13 +115,12 @@ module Gitlab end end - def batch_fetch(start, finish, mode) - # rubocop:disable GitlabSecurity/PublicSend - @relation.select(@column).public_send(mode).where(between_condition(start, finish)).send(@operation, *@operation_args) - end - private + def build_relation_batch(start, finish, mode) + @relation.select(@column).public_send(mode).where(between_condition(start, finish)) # rubocop:disable GitlabSecurity/PublicSend + end + def batch_size_for_mode_and_operation(mode, operation) return DEFAULT_SUM_BATCH_SIZE if operation == :sum @@ -145,6 +146,20 @@ module Gitlab raise 'Use distinct count for optimized distinct counting' if @relation.limit(1).distinct_value.present? && mode != :distinct raise 'Use distinct count only with non id fields' if @column == :id && mode == :distinct end + + def log_canceled_batch_fetch(batch_start, mode, query, error) + Gitlab::AppJsonLogger + .error( + event: 'batch_count', + relation: @relation.table_name, + operation: @operation, + operation_args: @operation_args, + start: batch_start, + mode: mode, + query: query, + message: "Query has been canceled with message: #{error.message}" + ) + end end end end diff --git a/lib/gitlab/git/wiki.rb b/lib/gitlab/git/wiki.rb index da2d015ca4a..83bd1091c7b 100644 --- a/lib/gitlab/git/wiki.rb +++ b/lib/gitlab/git/wiki.rb @@ -173,9 +173,9 @@ module Gitlab gitaly_pages = if load_content - gitaly_wiki_client.load_all_pages(params) + gitaly_wiki_client.load_all_pages(**params) else - gitaly_wiki_client.list_all_pages(params) + gitaly_wiki_client.list_all_pages(**params) end gitaly_pages.map do |wiki_page, version| diff --git a/lib/gitlab/graphql/query_analyzers/logger_analyzer.rb b/lib/gitlab/graphql/query_analyzers/logger_analyzer.rb index 1e568e9dcbc..1285365376f 100644 --- a/lib/gitlab/graphql/query_analyzers/logger_analyzer.rb +++ b/lib/gitlab/graphql/query_analyzers/logger_analyzer.rb @@ -25,7 +25,7 @@ module Gitlab end def call(memo, visit_type, irep_node) - memo + RequestStore.store[:graphql_logs] = memo end def final_value(memo) @@ -35,6 +35,8 @@ module Gitlab memo[:depth] = depth memo[:complexity] = complexity + # This duration is not the execution time of the + # query but the execution time of the analyzer. memo[:duration_s] = duration(memo[:time_started]).round(1) memo[:used_fields] = field_usages.first memo[:used_deprecated_fields] = field_usages.second diff --git a/lib/gitlab/template/gitlab_ci_yml_template.rb b/lib/gitlab/template/gitlab_ci_yml_template.rb index bb1e9db55fa..e12af6bf0a4 100644 --- a/lib/gitlab/template/gitlab_ci_yml_template.rb +++ b/lib/gitlab/template/gitlab_ci_yml_template.rb @@ -3,7 +3,7 @@ module Gitlab module Template class GitlabCiYmlTemplate < BaseTemplate - BASE_EXCLUDED_PATTERNS = [%r{\.latest$}].freeze + BASE_EXCLUDED_PATTERNS = [%r{\.latest\.}].freeze def content explanation = "# This file is a template, and might need editing before it works on your project." diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 5f83f93e7cc..2605bd918d5 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -6456,9 +6456,6 @@ msgstr "" msgid "ComboSearch is not defined" msgstr "" -msgid "Coming soon" -msgstr "" - msgid "Comma-separated, e.g. '1.1.1.1, 2.2.2.0/24'" msgstr "" @@ -18305,9 +18302,6 @@ msgstr "" msgid "PackageRegistry|If you haven't already done so, you will need to add the below to your %{codeStart}pom.xml%{codeEnd} file." msgstr "" -msgid "PackageRegistry|Is your favorite package manager missing? We'd love your help in building first-class support for it into GitLab! %{contributionLinkStart}Visit the contribution documentation%{contributionLinkEnd} to learn more about how to build support for new package managers into GitLab. Below is a list of package managers that are on our radar." -msgstr "" - msgid "PackageRegistry|Learn how to %{noPackagesLinkStart}publish and share your packages%{noPackagesLinkEnd} with GitLab." msgstr "" @@ -18329,9 +18323,6 @@ msgstr "" msgid "PackageRegistry|NPM" msgstr "" -msgid "PackageRegistry|No upcoming issues" -msgstr "" - msgid "PackageRegistry|NuGet" msgstr "" @@ -18377,9 +18368,6 @@ msgstr "" msgid "PackageRegistry|There are no packages yet" msgstr "" -msgid "PackageRegistry|There are no upcoming issues to display." -msgstr "" - msgid "PackageRegistry|There was a problem fetching the details for this package." msgstr "" @@ -18395,9 +18383,6 @@ msgstr "" msgid "PackageRegistry|Unable to load package" msgstr "" -msgid "PackageRegistry|Upcoming package managers" -msgstr "" - msgid "PackageRegistry|You are about to delete %{name}, this operation is irreversible, are you sure?" msgstr "" diff --git a/package.json b/package.json index c1bce4dc1a5..dec2b6d7a15 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@babel/preset-env": "^7.10.1", "@gitlab/at.js": "1.5.5", "@gitlab/svgs": "1.170.0", - "@gitlab/ui": "21.14.0", + "@gitlab/ui": "21.16.0", "@gitlab/visual-review-tools": "1.6.1", "@rails/actioncable": "^6.0.3-3", "@rails/ujs": "^6.0.3-2", diff --git a/rubocop/cop/migration/add_concurrent_foreign_key.rb b/rubocop/cop/migration/add_concurrent_foreign_key.rb index 236de6224a4..31cf426b2d4 100644 --- a/rubocop/cop/migration/add_concurrent_foreign_key.rb +++ b/rubocop/cop/migration/add_concurrent_foreign_key.rb @@ -11,7 +11,11 @@ module RuboCop MSG = '`add_foreign_key` requires downtime, use `add_concurrent_foreign_key` instead'.freeze def_node_matcher :false_node?, <<~PATTERN - (false) + (false) + PATTERN + + def_node_matcher :with_lock_retries?, <<~PATTERN + (:send nil? :with_lock_retries) PATTERN def on_send(node) @@ -19,9 +23,11 @@ module RuboCop name = node.children[1] - if name == :add_foreign_key && !not_valid_fk?(node) - add_offense(node, location: :selector) - end + return unless name == :add_foreign_key + return if in_with_lock_retries?(node) + return if not_valid_fk?(node) + + add_offense(node, location: :selector) end def method_name(node) @@ -33,6 +39,12 @@ module RuboCop pair.children[0].children[0] == :validate && false_node?(pair.children[1]) end end + + def in_with_lock_retries?(node) + node.each_ancestor(:block).any? do |parent| + with_lock_retries?(parent.to_a.first) + end + end end end end diff --git a/spec/controllers/every_controller_spec.rb b/spec/controllers/every_controller_spec.rb index 85f6f57bab6..d301c8b84ff 100644 --- a/spec/controllers/every_controller_spec.rb +++ b/spec/controllers/every_controller_spec.rb @@ -29,7 +29,7 @@ RSpec.describe "Every controller" do 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', - 'X', 'Y', 'Z', 'A', + 'X', 'Y', 'Z', 'A', 'G', 'Projects::MergeRequestsController') "#{controller}##{action}" diff --git a/spec/controllers/graphql_controller_spec.rb b/spec/controllers/graphql_controller_spec.rb index b0aa4b016d9..e4aea688a69 100644 --- a/spec/controllers/graphql_controller_spec.rb +++ b/spec/controllers/graphql_controller_spec.rb @@ -156,9 +156,11 @@ RSpec.describe GraphqlController do describe '#append_info_to_payload' do let(:graphql_query) { graphql_query_for('project', { 'fullPath' => 'foo' }, %w(id name)) } + let(:mock_store) { { graphql_logs: { foo: :bar } } } let(:log_payload) { {} } before do + allow(RequestStore).to receive(:store).and_return(mock_store) allow(controller).to receive(:append_info_to_payload).and_wrap_original do |method, *| method.call(log_payload) end @@ -168,7 +170,7 @@ RSpec.describe GraphqlController do post :execute, params: { query: graphql_query, operationName: 'Foo' } expect(controller).to have_received(:append_info_to_payload) - expect(log_payload.dig(:metadata, :graphql, :operation_name)).to eq('Foo') + expect(log_payload.dig(:metadata, :graphql)).to eq({ operation_name: 'Foo', foo: :bar }) end end end diff --git a/spec/controllers/projects/web_ide_terminals_controller_spec.rb b/spec/controllers/projects/web_ide_terminals_controller_spec.rb index 3eb3d5da351..09c471d2885 100644 --- a/spec/controllers/projects/web_ide_terminals_controller_spec.rb +++ b/spec/controllers/projects/web_ide_terminals_controller_spec.rb @@ -9,17 +9,20 @@ RSpec.describe Projects::WebIdeTerminalsController do let_it_be(:developer) { create(:user) } let_it_be(:reporter) { create(:user) } let_it_be(:guest) { create(:user) } - let_it_be(:project) { create(:project, :private, :repository, namespace: owner.namespace) } + let_it_be(:project) do + create(:project, :private, :repository, namespace: owner.namespace).tap do |project| + project.add_maintainer(maintainer) + project.add_developer(developer) + project.add_reporter(reporter) + project.add_guest(guest) + end + end + let(:pipeline) { create(:ci_pipeline, project: project, source: :webide, config_source: :webide_source, user: user) } let(:job) { create(:ci_build, pipeline: pipeline, user: user, project: project) } let(:user) { maintainer } before do - project.add_maintainer(maintainer) - project.add_developer(developer) - project.add_reporter(reporter) - project.add_guest(guest) - sign_in(user) end @@ -158,11 +161,11 @@ RSpec.describe Projects::WebIdeTerminalsController do end context 'access rights' do - before do - subject + it_behaves_like 'terminal access rights' do + before do + subject + end end - - it_behaves_like 'terminal access rights' end it 'increases the web ide terminal counter' do diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb index 47d234df22b..75bcc32e6f3 100644 --- a/spec/controllers/sessions_controller_spec.rb +++ b/spec/controllers/sessions_controller_spec.rb @@ -100,6 +100,16 @@ RSpec.describe SessionsController do end end + context 'a `blocked pending approval` user' do + it 'does not authenticate the user' do + user.block_pending_approval! + post_action + + expect(@request.env['warden']).not_to be_authenticated + expect(flash[:alert]).to include('Your account is pending approval from your GitLab administrator and hence blocked') + end + end + context 'an internal user' do it 'does not authenticate the user' do user.ghost! diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index 091c9d5a245..87e4a8e355d 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -15,7 +15,7 @@ FactoryBot.define do # Associations namespace - creator { group ? create(:user) : namespace&.owner } + creator { group ? association(:user) : namespace&.owner } transient do # Nest Project Feature attributes diff --git a/spec/factories/users.rb b/spec/factories/users.rb index 1a8c5d7e40c..2e5b3be3bf2 100644 --- a/spec/factories/users.rb +++ b/spec/factories/users.rb @@ -23,6 +23,14 @@ FactoryBot.define do after(:build) { |user, _| user.block! } end + trait :blocked_pending_approval do + after(:build) { |user, _| user.block_pending_approval! } + end + + trait :ldap_blocked do + after(:build) { |user, _| user.ldap_block! } + end + trait :bot do user_type { :alert_bot } end diff --git a/spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb b/spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb index 3dc49fb4dea..444d5371e7a 100644 --- a/spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb +++ b/spec/features/merge_request/user_merges_when_pipeline_succeeds_spec.rb @@ -47,7 +47,7 @@ RSpec.describe 'Merge request > User merges when pipeline succeeds', :js do it_behaves_like 'Merge when pipeline succeeds activator' end - context 'when enabled after pipeline status changed' do + context 'when enabled after pipeline status changed', quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/258667' do before do pipeline.run! diff --git a/spec/frontend/packages/list/coming_soon/helpers_spec.js b/spec/frontend/packages/list/coming_soon/helpers_spec.js deleted file mode 100644 index 4a996bfad76..00000000000 --- a/spec/frontend/packages/list/coming_soon/helpers_spec.js +++ /dev/null @@ -1,36 +0,0 @@ -import * as comingSoon from '~/packages/list/coming_soon/helpers'; -import { fakeIssues, asGraphQLResponse, asViewModel } from './mock_data'; - -jest.mock('~/api.js'); - -describe('Coming Soon Helpers', () => { - const [noLabels, acceptingMergeRequestLabel, workflowLabel] = fakeIssues; - - describe('toViewModel', () => { - it('formats a GraphQL response correctly', () => { - expect(comingSoon.toViewModel(asGraphQLResponse)).toEqual(asViewModel); - }); - }); - - describe('findWorkflowLabel', () => { - it('finds a workflow label', () => { - expect(comingSoon.findWorkflowLabel(workflowLabel.labels)).toEqual(workflowLabel.labels[0]); - }); - - it("returns undefined when there isn't one", () => { - expect(comingSoon.findWorkflowLabel(noLabels.labels)).toBeUndefined(); - }); - }); - - describe('findAcceptingContributionsLabel', () => { - it('finds the correct label when it exists', () => { - expect(comingSoon.findAcceptingContributionsLabel(acceptingMergeRequestLabel.labels)).toEqual( - acceptingMergeRequestLabel.labels[0], - ); - }); - - it("returns undefined when there isn't one", () => { - expect(comingSoon.findAcceptingContributionsLabel(noLabels.labels)).toBeUndefined(); - }); - }); -}); diff --git a/spec/frontend/packages/list/coming_soon/mock_data.js b/spec/frontend/packages/list/coming_soon/mock_data.js deleted file mode 100644 index bb4568e4bd5..00000000000 --- a/spec/frontend/packages/list/coming_soon/mock_data.js +++ /dev/null @@ -1,90 +0,0 @@ -export const fakeIssues = [ - { - id: 1, - iid: 1, - title: 'issue one', - webUrl: 'foo', - }, - { - id: 2, - iid: 2, - title: 'issue two', - labels: [{ title: 'Accepting merge requests', color: '#69d100' }], - milestone: { - title: '12.10', - }, - webUrl: 'foo', - }, - { - id: 3, - iid: 3, - title: 'issue three', - labels: [{ title: 'workflow::In dev', color: '#428bca' }], - webUrl: 'foo', - }, - { - id: 4, - iid: 4, - title: 'issue four', - labels: [ - { title: 'Accepting merge requests', color: '#69d100' }, - { title: 'workflow::In dev', color: '#428bca' }, - ], - webUrl: 'foo', - }, -]; - -export const asGraphQLResponse = { - project: { - issues: { - nodes: fakeIssues.map(x => ({ - ...x, - labels: { - nodes: x.labels, - }, - })), - }, - }, -}; - -export const asViewModel = [ - { - ...fakeIssues[0], - labels: [], - }, - { - ...fakeIssues[1], - labels: [ - { - title: 'Accepting merge requests', - color: '#69d100', - scoped: false, - }, - ], - }, - { - ...fakeIssues[2], - labels: [ - { - title: 'workflow::In dev', - color: '#428bca', - scoped: true, - }, - ], - }, - { - ...fakeIssues[3], - labels: [ - { - title: 'workflow::In dev', - color: '#428bca', - scoped: true, - }, - { - title: 'Accepting merge requests', - color: '#69d100', - scoped: false, - }, - ], - }, -]; diff --git a/spec/frontend/packages/list/coming_soon/packages_coming_soon_spec.js b/spec/frontend/packages/list/coming_soon/packages_coming_soon_spec.js deleted file mode 100644 index c4cdadc45e6..00000000000 --- a/spec/frontend/packages/list/coming_soon/packages_coming_soon_spec.js +++ /dev/null @@ -1,138 +0,0 @@ -import { GlEmptyState, GlSkeletonLoader, GlLabel } from '@gitlab/ui'; -import { mount, createLocalVue } from '@vue/test-utils'; -import VueApollo, { ApolloQuery } from 'vue-apollo'; -import ComingSoon from '~/packages/list/coming_soon/packages_coming_soon.vue'; -import { TrackingActions } from '~/packages/shared/constants'; -import { asViewModel } from './mock_data'; -import Tracking from '~/tracking'; - -jest.mock('~/packages/list/coming_soon/helpers.js'); - -const localVue = createLocalVue(); -localVue.use(VueApollo); - -describe('packages_coming_soon', () => { - let wrapper; - - const findSkeletonLoader = () => wrapper.find(GlSkeletonLoader); - const findAllIssues = () => wrapper.findAll('[data-testid="issue-row"]'); - const findIssuesData = () => - findAllIssues().wrappers.map(x => { - const titleLink = x.find('[data-testid="issue-title-link"]'); - const milestone = x.find('[data-testid="milestone"]'); - const issueIdLink = x.find('[data-testid="issue-id-link"]'); - const labels = x.findAll(GlLabel); - - const issueId = Number(issueIdLink.text().substr(1)); - - return { - id: issueId, - iid: issueId, - title: titleLink.text(), - webUrl: titleLink.attributes('href'), - labels: labels.wrappers.map(label => ({ - color: label.props('backgroundColor'), - title: label.props('title'), - scoped: label.props('scoped'), - })), - ...(milestone.exists() ? { milestone: { title: milestone.text() } } : {}), - }; - }); - const findIssueTitleLink = () => wrapper.find('[data-testid="issue-title-link"]'); - const findIssueIdLink = () => wrapper.find('[data-testid="issue-id-link"]'); - const findEmptyState = () => wrapper.find(GlEmptyState); - - const mountComponent = (testParams = {}) => { - const $apolloData = { - loading: testParams.isLoading || false, - }; - - wrapper = mount(ComingSoon, { - localVue, - propsData: { - illustration: 'foo', - projectPath: 'foo', - suggestedContributionsPath: 'foo', - }, - stubs: { - ApolloQuery, - GlLink: true, - }, - mocks: { - $apolloData, - }, - }); - - // Mock the GraphQL query result - wrapper.find(ApolloQuery).setData({ - result: { - data: testParams.issues || asViewModel, - }, - }); - }; - - afterEach(() => { - wrapper.destroy(); - wrapper = null; - }); - - describe('when loading', () => { - beforeEach(() => mountComponent({ isLoading: true })); - - it('renders the skeleton loader', () => { - expect(findSkeletonLoader().exists()).toBe(true); - }); - }); - - describe('when there are no issues', () => { - beforeEach(() => mountComponent({ issues: [] })); - - it('renders the empty state', () => { - expect(findEmptyState().exists()).toBe(true); - }); - }); - - describe('when there are issues', () => { - beforeEach(() => mountComponent()); - - it('renders each issue', () => { - expect(findIssuesData()).toEqual(asViewModel); - }); - }); - - describe('tracking', () => { - const firstIssue = asViewModel[0]; - let eventSpy; - - beforeEach(() => { - eventSpy = jest.spyOn(Tracking, 'event'); - mountComponent(); - }); - - it('tracks when mounted', () => { - expect(eventSpy).toHaveBeenCalledWith(undefined, TrackingActions.COMING_SOON_REQUESTED, {}); - }); - - it('tracks when an issue title link is clicked', () => { - eventSpy.mockClear(); - - findIssueTitleLink().vm.$emit('click'); - - expect(eventSpy).toHaveBeenCalledWith(undefined, TrackingActions.COMING_SOON_LIST, { - label: firstIssue.title, - value: firstIssue.iid, - }); - }); - - it('tracks when an issue id link is clicked', () => { - eventSpy.mockClear(); - - findIssueIdLink().vm.$emit('click'); - - expect(eventSpy).toHaveBeenCalledWith(undefined, TrackingActions.COMING_SOON_LIST, { - label: firstIssue.title, - value: firstIssue.iid, - }); - }); - }); -}); diff --git a/spec/frontend/packages/list/components/__snapshots__/packages_list_app_spec.js.snap b/spec/frontend/packages/list/components/__snapshots__/packages_list_app_spec.js.snap index 9a52531ae8d..ce3a58c856d 100644 --- a/spec/frontend/packages/list/components/__snapshots__/packages_list_app_spec.js.snap +++ b/spec/frontend/packages/list/components/__snapshots__/packages_list_app_spec.js.snap @@ -444,8 +444,6 @@ exports[`packages_list_app renders 1`] = ` - -