Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue28
-rw-r--r--app/assets/javascripts/vue_shared/constants.js2
-rw-r--r--app/assets/javascripts/work_items/components/work_item_created_updated.vue23
-rw-r--r--app/assets/javascripts/work_items/components/work_item_detail.vue39
-rw-r--r--app/models/ci/job_artifact.rb10
-rw-r--r--app/models/ci/runner.rb19
-rw-r--r--app/models/commit_status.rb8
-rw-r--r--app/models/concerns/ci/partitionable.rb1
-rw-r--r--app/models/concerns/ci/partitionable/switch.rb44
-rw-r--r--app/models/repository.rb4
-rw-r--r--app/services/metrics/users_starred_dashboards/create_service.rb76
-rw-r--r--app/services/metrics/users_starred_dashboards/delete_service.rb35
-rw-r--r--config/feature_flags/development/ci_partitioning_use_ci_builds_routing_table.yml8
-rw-r--r--config/feature_flags/development/code_suggestions_tokens_from_customers_dot.yml2
-rw-r--r--config/feature_flags/development/self_managed_code_suggestions_completion_api.yml2
-rw-r--r--config/gitlab_loose_foreign_keys.yml20
-rw-r--r--config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml1
-rw-r--r--config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml1
-rw-r--r--config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml1
-rw-r--r--config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml1
-rw-r--r--config/metrics/counts_28d/20210216175413_clusters_management_project.yml1
-rw-r--r--config/metrics/counts_28d/20210216175415_clusters_disabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216175417_clusters_enabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml1
-rw-r--r--config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml1
-rw-r--r--config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml1
-rw-r--r--config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml1
-rw-r--r--config/metrics/counts_28d/20210216180317_snippets.yml1
-rw-r--r--config/metrics/counts_28d/20210514013545_i_code_review_user_resolve_conflict_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210514013549_i_code_review_user_load_conflict_ui_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210816143831_i_code_review_total_suggestions_added_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210816144453_i_code_review_total_suggestions_applied_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210908150458_i_code_review_user_resolve_thread_in_issue_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20210910132229_user_auth_by_provider.yml1
-rw-r--r--config/metrics/counts_28d/20210916080405_promoted_issues.yml1
-rw-r--r--config/metrics/counts_28d/20211118200530_p_ci_templates_security_dast_on_demand_api_scan_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20220504150641_count_notes_in_ipynb_diff_commit_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20220504150641_count_notes_in_ipynb_diff_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20220504150641_count_notes_in_ipynb_diff_mr_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20220504150641_count_users_with_notes_in_ipynb_diff_commit_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20220504150641_count_users_with_notes_in_ipynb_diff_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20220504150641_count_users_with_notes_in_ipynb_diff_mr_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20220525231314_unique_monthly_active_users.yml1
-rw-r--r--config/metrics/counts_28d/20220615103718_incident_management_timeline_event_total_unique_counts_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20220622084700_p_analytics_ci_cd_time_to_restore_service_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20220707022802_users_updating_weight_estimate_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20220707054530_p_analytics_ci_cd_change_failure_rate_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20220907080630_i_quickactions_timeline_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20221006065524_i_quickactions_link_monthly.yml1
-rw-r--r--config/metrics/counts_28d/20230120094644_g_runner_fleet_read_jobs_statistics_monthly.yml1
-rw-r--r--config/metrics/counts_7d/20210428142406_users_viewing_analytics_group_devops_adoption.yml1
-rw-r--r--config/metrics/counts_7d/20210514013544_i_code_review_user_load_conflict_ui_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210514013545_i_code_review_user_resolve_conflict_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210816144119_i_code_review_total_suggestions_added_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210816144247_i_code_review_total_suggestions_applied_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210908151645_i_code_review_user_resolve_thread_in_issue_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml1
-rw-r--r--config/metrics/counts_7d/20211118200524_p_ci_templates_security_dast_on_demand_api_scan_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20220504150641_count_notes_in_ipynb_diff_commit_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20220504150641_count_notes_in_ipynb_diff_mr_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20220504150641_count_notes_in_ipynb_diff_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20220504150641_count_users_with_notes_in_ipynb_diff_commit_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20220504150641_count_users_with_notes_in_ipynb_diff_mr_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20220504150641_count_users_with_notes_in_ipynb_diff_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20220615103711_incident_management_timeline_event_total_unique_counts_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20220622084654_p_analytics_ci_cd_time_to_restore_service_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20220707022758_users_updating_weight_estimate_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20220707054526_p_analytics_ci_cd_change_failure_rate_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20220907080626_i_quickactions_timeline_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20221006065521_i_quickactions_link_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20230120094643_g_runner_fleet_read_jobs_statistics_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20230509085219_i_quickactions_blocked_by_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20230509090906_i_quickactions_blocks_weekly.yml1
-rw-r--r--config/metrics/counts_7d/20230607110346_i_quickactions_promote_to_weekly.yml1
-rw-r--r--config/metrics/counts_all/20210216180316_snippets.yml1
-rw-r--r--config/metrics/counts_all/20210502045402_ci_runners_instance_type_active.yml1
-rw-r--r--config/metrics/counts_all/20210502050341_ci_runners_group_type_active.yml1
-rw-r--r--config/metrics/counts_all/20210502050834_ci_runners_project_type_active.yml1
-rw-r--r--config/metrics/counts_all/20210502050942_ci_runners_online.yml1
-rw-r--r--config/metrics/counts_all/20210502051651_ci_runners_instance_type_active_online.yml1
-rw-r--r--config/metrics/counts_all/20210502051922_ci_runners_group_type_active_online.yml1
-rw-r--r--config/metrics/counts_all/20210502052036_ci_runners_project_type_active_online.yml1
-rw-r--r--config/metrics/counts_all/20210510201537_in_product_marketing_email_create_0_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510201919_in_product_marketing_email_create_0_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510202148_in_product_marketing_email_create_1_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510202356_in_product_marketing_email_create_1_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510202604_in_product_marketing_email_create_2_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510202724_in_product_marketing_email_create_2_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510202807_in_product_marketing_email_verify_0_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510202943_in_product_marketing_email_verify_0_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510202955_in_product_marketing_email_verify_1_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510203005_in_product_marketing_email_verify_1_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510203015_in_product_marketing_email_verify_2_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510203025_in_product_marketing_email_verify_2_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510203035_in_product_marketing_email_trial_0_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510203044_in_product_marketing_email_trial_0_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510203054_in_product_marketing_email_trial_1_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510203104_in_product_marketing_email_trial_1_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510203114_in_product_marketing_email_trial_2_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510203124_in_product_marketing_email_trial_2_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510203134_in_product_marketing_email_team_0_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510203143_in_product_marketing_email_team_0_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510203153_in_product_marketing_email_team_1_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510203203_in_product_marketing_email_team_1_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210510203213_in_product_marketing_email_team_2_sent.yml1
-rw-r--r--config/metrics/counts_all/20210510203223_in_product_marketing_email_team_2_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210518081225_in_product_marketing_email_experience_0_sent.yml1
-rw-r--r--config/metrics/counts_all/20210709191135_package_events_i_package_nuget_pull_symbol_package.yml1
-rw-r--r--config/metrics/counts_all/20210709191829_package_events_i_package_nuget_push_symbol_package.yml1
-rw-r--r--config/metrics/counts_all/20210709210941_package_events_i_package_pull_symbol_package.yml1
-rw-r--r--config/metrics/counts_all/20210709211058_package_events_i_package_pull_symbol_package_by_deploy_token.yml1
-rw-r--r--config/metrics/counts_all/20210709211248_package_events_i_package_pull_symbol_package_by_guest.yml1
-rw-r--r--config/metrics/counts_all/20210709211341_package_events_i_package_pull_symbol_package_by_user.yml1
-rw-r--r--config/metrics/counts_all/20210709211439_package_events_i_package_push_symbol_package.yml1
-rw-r--r--config/metrics/counts_all/20210709211636_package_events_i_package_push_symbol_package_by_deploy_token.yml1
-rw-r--r--config/metrics/counts_all/20210709211731_package_events_i_package_push_symbol_package_by_guest.yml1
-rw-r--r--config/metrics/counts_all/20210709211831_package_events_i_package_push_symbol_package_by_user.yml1
-rw-r--r--config/metrics/counts_all/20210727095918_in_product_marketing_email_team_short_0_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210727095923_in_product_marketing_email_team_short_0_sent.yml1
-rw-r--r--config/metrics/counts_all/20210727170553_in_product_marketing_email_trial_short_0_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210727170558_in_product_marketing_email_trial_short_0_sent.yml1
-rw-r--r--config/metrics/counts_all/20210729140021_in_product_marketing_email_admin_verify_0_cta_clicked.yml1
-rw-r--r--config/metrics/counts_all/20210729140423_in_product_marketing_email_admin_verify_0_sent.yml1
-rw-r--r--config/metrics/counts_all/20210730011801_projects_zentao_active.yml1
-rw-r--r--config/metrics/counts_all/20210730011802_groups_zentao_active.yml1
-rw-r--r--config/metrics/counts_all/20210730011804_instances_zentao_active.yml1
-rw-r--r--config/metrics/counts_all/20210730011805_projects_inheriting_zentao_active.yml1
-rw-r--r--config/metrics/counts_all/20210730011806_groups_inheriting_zentao_active.yml1
-rw-r--r--config/metrics/counts_all/20210910132001_user_auth_by_provider.yml1
-rw-r--r--config/metrics/counts_all/20210916100524_groups_gitlab_slack_application_active.yml1
-rw-r--r--config/metrics/counts_all/20210916101641_projects_gitlab_slack_application_active.yml1
-rw-r--r--config/metrics/counts_all/20210916101837_instances_gitlab_slack_application_active.yml1
-rw-r--r--config/metrics/counts_all/20210917040700_groups_inheriting_gitlab_slack_application_active.yml1
-rw-r--r--config/metrics/counts_all/20210917040956_projects_inheriting_gitlab_slack_application_active.yml1
-rw-r--r--config/metrics/counts_all/20211028210001_projects_shimo_active.yml1
-rw-r--r--config/metrics/counts_all/20211028210002_groups_shimo_active.yml1
-rw-r--r--config/metrics/counts_all/20211028210003_instances_shimo_active.yml1
-rw-r--r--config/metrics/counts_all/20211028210004_projects_inheriting_shimo_active.yml1
-rw-r--r--config/metrics/counts_all/20211028210005_groups_inheriting_shimo_active.yml1
-rw-r--r--config/metrics/counts_all/20220314362302_service_usage_data_download_payload.yml1
-rw-r--r--config/metrics/counts_all/20230306191328_i_container_registry_delete_manifest.yml1
-rw-r--r--doc/api/graphql/reference/index.md12
-rw-r--r--doc/ci/docker/using_kaniko.md4
-rw-r--r--doc/development/contributing/index.md2
-rw-r--r--doc/development/fe_guide/index.md2
-rw-r--r--doc/development/i18n/externalization.md59
-rw-r--r--doc/development/migration_style_guide.md12
-rw-r--r--doc/update/index.md15
-rw-r--r--doc/user/group/manage.md3
-rw-r--r--lib/api/metrics/user_starred_dashboards.rb21
-rw-r--r--lib/gitlab/git/repository.rb6
-rw-r--r--lib/gitlab/gitaly_client/commit_service.rb9
-rw-r--r--locale/gitlab.pot12
-rw-r--r--spec/db/schema_spec.rb9
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap38
-rw-r--r--spec/frontend/packages_and_registries/package_registry/components/list/package_list_row_spec.js37
-rw-r--r--spec/frontend/work_items/components/work_item_created_updated_spec.js38
-rw-r--r--spec/frontend/work_items/components/work_item_detail_spec.js31
-rw-r--r--spec/lib/gitlab/git/repository_spec.rb6
-rw-r--r--spec/lib/gitlab/gitaly_client/commit_service_spec.rb18
-rw-r--r--spec/models/ci/build_spec.rb22
-rw-r--r--spec/models/ci/job_artifact_spec.rb78
-rw-r--r--spec/models/ci/runner_spec.rb40
-rw-r--r--spec/models/commit_status_spec.rb22
-rw-r--r--spec/models/concerns/ci/partitionable/switch_spec.rb20
-rw-r--r--spec/models/concerns/ci/partitionable_spec.rb10
-rw-r--r--spec/models/repository_spec.rb18
-rw-r--r--spec/requests/api/metrics/user_starred_dashboards_spec.rb57
-rw-r--r--spec/services/ci/delete_objects_service_spec.rb225
-rw-r--r--spec/services/metrics/users_starred_dashboards/create_service_spec.rb73
-rw-r--r--spec/services/metrics/users_starred_dashboards/delete_service_spec.rb41
-rw-r--r--spec/support/helpers/models/ci/partitioning_testing/schema_helpers.rb11
177 files changed, 525 insertions, 877 deletions
diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue
index bca43d0b20a..a545ad1d09c 100644
--- a/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue
+++ b/app/assets/javascripts/packages_and_registries/package_registry/components/list/package_list_row.vue
@@ -1,7 +1,7 @@
<script>
import {
- GlDropdown,
- GlDropdownItem,
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
GlFormCheckbox,
GlIcon,
GlSprintf,
@@ -28,8 +28,8 @@ import TimeagoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
export default {
name: 'PackageListRow',
components: {
- GlDropdown,
- GlDropdownItem,
+ GlDisclosureDropdown,
+ GlDisclosureDropdownItem,
GlFormCheckbox,
GlIcon,
GlSprintf,
@@ -194,18 +194,22 @@ export default {
</template>
<template v-if="packageEntity.canDestroy" #right-action>
- <gl-dropdown
+ <gl-disclosure-dropdown
+ category="tertiary"
data-testid="delete-dropdown"
icon="ellipsis_v"
- :text="$options.i18n.moreActions"
- :text-sr-only="true"
- category="tertiary"
+ :toggle-text="$options.i18n.moreActions"
+ text-sr-only
no-caret
>
- <gl-dropdown-item data-testid="action-delete" variant="danger" @click="$emit('delete')">{{
- $options.i18n.deletePackage
- }}</gl-dropdown-item>
- </gl-dropdown>
+ <gl-disclosure-dropdown-item data-testid="action-delete" @action="$emit('delete')">
+ <template #list-item>
+ <span class="gl-text-red-500">
+ {{ $options.i18n.deletePackage }}
+ </span>
+ </template>
+ </gl-disclosure-dropdown-item>
+ </gl-disclosure-dropdown>
</template>
</list-item>
</template>
diff --git a/app/assets/javascripts/vue_shared/constants.js b/app/assets/javascripts/vue_shared/constants.js
index 8946a02e663..d9bc2c82688 100644
--- a/app/assets/javascripts/vue_shared/constants.js
+++ b/app/assets/javascripts/vue_shared/constants.js
@@ -86,7 +86,7 @@ export const confidentialityInfoText = (workspaceType, issuableType) =>
),
{
workspaceType: workspaceType === WORKSPACE_PROJECT ? __('project') : __('group'),
- issuableType: issuableType === TYPE_ISSUE ? __('issue') : __('epic'),
+ issuableType: issuableType.toLowerCase(),
permissions:
issuableType === TYPE_ISSUE
? __('at least the Reporter role, the author, and assignees')
diff --git a/app/assets/javascripts/work_items/components/work_item_created_updated.vue b/app/assets/javascripts/work_items/components/work_item_created_updated.vue
index a6cc37290fb..f93ea4a0753 100644
--- a/app/assets/javascripts/work_items/components/work_item_created_updated.vue
+++ b/app/assets/javascripts/work_items/components/work_item_created_updated.vue
@@ -1,8 +1,10 @@
<script>
-import { GlAvatarLink, GlSprintf } from '@gitlab/ui';
+import { GlAvatarLink, GlSprintf, GlLoadingIcon } from '@gitlab/ui';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
+import { WORKSPACE_PROJECT } from '~/issues/constants';
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
import WorkItemStateBadge from '~/work_items/components/work_item_state_badge.vue';
+import ConfidentialityBadge from '~/vue_shared/components/confidentiality_badge.vue';
import WorkItemTypeIcon from '~/work_items/components/work_item_type_icon.vue';
import workItemByIidQuery from '../graphql/work_item_by_iid.query.graphql';
@@ -13,6 +15,8 @@ export default {
TimeAgoTooltip,
WorkItemStateBadge,
WorkItemTypeIcon,
+ ConfidentialityBadge,
+ GlLoadingIcon,
},
inject: ['fullPath'],
props: {
@@ -21,6 +25,11 @@ export default {
required: false,
default: null,
},
+ updateInProgress: {
+ type: Boolean,
+ required: false,
+ default: false,
+ },
},
computed: {
createdAt() {
@@ -44,6 +53,9 @@ export default {
workItemIconName() {
return this.workItem?.workItemType?.iconName;
},
+ isWorkItemConfidential() {
+ return this.workItem?.confidential;
+ },
},
apollo: {
workItem: {
@@ -62,12 +74,21 @@ export default {
},
},
},
+ WORKSPACE_PROJECT,
};
</script>
<template>
<div class="gl-mb-3 gl-text-gray-700">
<work-item-state-badge v-if="workItemState" :work-item-state="workItemState" />
+ <gl-loading-icon v-if="updateInProgress" :inline="true" class="gl-mr-3" />
+ <confidentiality-badge
+ v-if="isWorkItemConfidential"
+ class="gl-vertical-align-middle gl-display-inline-flex!"
+ data-testid="confidential"
+ :workspace-type="$options.WORKSPACE_PROJECT"
+ :issuable-type="workItemType"
+ />
<work-item-type-icon
class="gl-vertical-align-middle gl-mr-0!"
:work-item-icon-name="workItemIconName"
diff --git a/app/assets/javascripts/work_items/components/work_item_detail.vue b/app/assets/javascripts/work_items/components/work_item_detail.vue
index 24fcc85dabf..d826ef9cbe7 100644
--- a/app/assets/javascripts/work_items/components/work_item_detail.vue
+++ b/app/assets/javascripts/work_items/components/work_item_detail.vue
@@ -5,7 +5,6 @@ import {
GlSkeletonLoader,
GlLoadingIcon,
GlIcon,
- GlBadge,
GlButton,
GlTooltipDirective,
GlEmptyState,
@@ -19,8 +18,9 @@ import { getIdFromGraphQLId } from '~/graphql_shared/utils';
import { isLoggedIn } from '~/lib/utils/common_utils';
import WorkItemTypeIcon from '~/work_items/components/work_item_type_icon.vue';
import AbuseCategorySelector from '~/abuse_reports/components/abuse_category_selector.vue';
+import ConfidentialityBadge from '~/vue_shared/components/confidentiality_badge.vue';
+import { WORKSPACE_PROJECT } from '~/issues/constants';
import {
- sprintfWorkItem,
i18n,
WIDGET_TYPE_ASSIGNEES,
WIDGET_TYPE_NOTIFICATIONS,
@@ -60,7 +60,6 @@ export default {
components: {
WorkItemStateToggleButton,
GlAlert,
- GlBadge,
GlButton,
GlLoadingIcon,
GlSkeletonLoader,
@@ -79,6 +78,7 @@ export default {
WorkItemDetailModal,
AbuseCategorySelector,
GlIntersectionObserver,
+ ConfidentialityBadge,
},
mixins: [glFeatureFlagMixin()],
inject: ['fullPath', 'reportAbusePath'],
@@ -186,9 +186,6 @@ export default {
canAssignUnassignUser() {
return this.workItemAssignees && this.canSetWorkItemMetadata;
},
- confidentialTooltip() {
- return sprintfWorkItem(this.$options.i18n.confidentialTooltip, this.workItemType);
- },
fullPath() {
return this.workItem?.project.fullPath;
},
@@ -377,8 +374,8 @@ export default {
}
},
},
-
WORK_ITEM_TYPE_VALUE_OBJECTIVE,
+ WORKSPACE_PROJECT,
};
</script>
@@ -439,16 +436,6 @@ export default {
/>
{{ workItemBreadcrumbReference }}
</div>
- <gl-loading-icon v-if="updateInProgress" :inline="true" class="gl-mr-3" />
- <gl-badge
- v-if="workItem.confidential"
- v-gl-tooltip.bottom
- :title="confidentialTooltip"
- variant="warning"
- icon="eye-slash"
- class="gl-mr-3 gl-cursor-help"
- >{{ __('Confidential') }}</gl-badge
- >
<work-item-state-toggle-button
v-if="canUpdate"
:work-item-id="workItem.id"
@@ -503,7 +490,10 @@ export default {
:can-update="canUpdate"
@error="updateError = $event"
/>
- <work-item-created-updated :work-item-iid="workItemIid" />
+ <work-item-created-updated
+ :work-item-iid="workItemIid"
+ :update-in-progress="updateInProgress"
+ />
</div>
<gl-intersection-observer
v-if="showIntersectionObserver"
@@ -523,15 +513,12 @@ export default {
{{ workItem.title }}
</span>
<gl-loading-icon v-if="updateInProgress" class="gl-mr-3" />
- <gl-badge
+ <confidentiality-badge
v-if="workItem.confidential"
- v-gl-tooltip.bottom
- :title="confidentialTooltip"
- variant="warning"
- icon="eye-slash"
- class="gl-mr-3 gl-cursor-help"
- >{{ __('Confidential') }}</gl-badge
- >
+ data-testid="confidential"
+ :workspace-type="$options.WORKSPACE_PROJECT"
+ :issuable-type="workItemType"
+ />
<work-item-todos
v-if="showWorkItemCurrentUserTodos"
:work-item-id="workItem.id"
diff --git a/app/models/ci/job_artifact.rb b/app/models/ci/job_artifact.rb
index 483386f1f1b..11d70e088e9 100644
--- a/app/models/ci/job_artifact.rb
+++ b/app/models/ci/job_artifact.rb
@@ -341,16 +341,10 @@ module Ci
end
def to_deleted_object_attrs(pick_up_at = nil)
- final_path_store_dir, final_path_filename = nil
- if file_final_path.present?
- final_path_store_dir = File.dirname(file_final_path)
- final_path_filename = File.basename(file_final_path)
- end
-
{
file_store: file_store,
- store_dir: final_path_store_dir || file.store_dir.to_s,
- file: final_path_filename || file_identifier,
+ store_dir: file.store_dir.to_s,
+ file: file_identifier,
pick_up_at: pick_up_at || expire_at || Time.current
}
end
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index 4eb5c3c9ed2..0413bb480d4 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -87,19 +87,23 @@ module Ci
scope :active, -> (value = true) { where(active: value) }
scope :paused, -> { active(false) }
- scope :online, -> { where('contacted_at > ?', online_contact_time_deadline) }
+ scope :online, -> { where(arel_table[:contacted_at].gt(online_contact_time_deadline)) }
scope :recent, -> do
- where('ci_runners.created_at >= :datetime OR ci_runners.contacted_at >= :datetime', datetime: stale_deadline)
+ timestamp = stale_deadline
+
+ where(arel_table[:created_at].gteq(timestamp).or(arel_table[:contacted_at].gteq(timestamp)))
end
scope :stale, -> do
- where('ci_runners.created_at <= :datetime AND ' \
- '(ci_runners.contacted_at IS NULL OR ci_runners.contacted_at <= :datetime)', datetime: stale_deadline)
+ timestamp = stale_deadline
+
+ where(arel_table[:created_at].lteq(timestamp))
+ .where(arel_table[:contacted_at].eq(nil).or(arel_table[:contacted_at].lteq(timestamp)))
end
scope :offline, -> { where(arel_table[:contacted_at].lteq(online_contact_time_deadline)) }
scope :never_contacted, -> { where(contacted_at: nil) }
scope :ordered, -> { order(id: :desc) }
- scope :with_recent_runner_queue, -> { where('contacted_at > ?', recent_queue_deadline) }
+ scope :with_recent_runner_queue, -> { where(arel_table[:contacted_at].gt(recent_queue_deadline)) }
scope :with_running_builds, -> do
where('EXISTS(?)',
::Ci::Build.running.select(1)
@@ -513,7 +517,10 @@ module Ci
private
scope :with_upgrade_status, ->(upgrade_status) do
- joins(:runner_version).where(runner_version: { status: upgrade_status })
+ joins(:runner_managers)
+ .joins("INNER JOIN #{RunnerVersion.quoted_table_name} runner_version " \
+ "ON runner_version.version = #{RunnerManager.quoted_table_name}.version")
+ .where(runner_version: { status: upgrade_status })
end
EXECUTOR_NAME_TO_TYPES = {
diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb
index 3f631f583b6..c2425e9460a 100644
--- a/app/models/commit_status.rb
+++ b/app/models/commit_status.rb
@@ -9,10 +9,16 @@ class CommitStatus < Ci::ApplicationRecord
include BulkInsertableAssociations
include TaggableQueries
+ ROUTING_FEATURE_FLAG = :ci_partitioning_use_ci_builds_routing_table
+
self.table_name = 'ci_builds'
self.sequence_name = 'ci_builds_id_seq'
self.primary_key = :id
- partitionable scope: :pipeline
+
+ partitionable scope: :pipeline, through: {
+ table: :p_ci_builds,
+ flag: ROUTING_FEATURE_FLAG
+ }
belongs_to :user
belongs_to :project
diff --git a/app/models/concerns/ci/partitionable.rb b/app/models/concerns/ci/partitionable.rb
index a3bcc7bcbbc..ec6c85d888d 100644
--- a/app/models/concerns/ci/partitionable.rb
+++ b/app/models/concerns/ci/partitionable.rb
@@ -80,6 +80,7 @@ module Ci
def handle_partitionable_through(options)
return unless options
+ return if Gitlab::Utils.to_boolean(ENV['DISABLE_PARTITIONABLE_SWITCH'], default: false)
define_singleton_method(:routing_table_name) { options[:table] }
define_singleton_method(:routing_table_name_flag) { options[:flag] }
diff --git a/app/models/concerns/ci/partitionable/switch.rb b/app/models/concerns/ci/partitionable/switch.rb
index c1bbd107e9f..6195f92114f 100644
--- a/app/models/concerns/ci/partitionable/switch.rb
+++ b/app/models/concerns/ci/partitionable/switch.rb
@@ -2,6 +2,8 @@
module Ci
module Partitionable
+ MUTEX = Mutex.new
+
module Switch
extend ActiveSupport::Concern
@@ -14,18 +16,39 @@ module Ci
predicate_builder cached_find_by_statement].freeze
included do |base|
- partitioned = Class.new(base) do
- self.table_name = base.routing_table_name
+ install_partitioned_class(base)
+ end
+
+ class_methods do
+ # `Class.new(partitionable_model)` triggers `partitionable_model.inherited`
+ # and we need the mutex to break the recursion without adding extra accessors
+ # on the model. This will be used during code loading, not runtime.
+ #
+ def install_partitioned_class(partitionable_model)
+ Partitionable::MUTEX.synchronize do
+ partitioned = Class.new(partitionable_model) do
+ self.table_name = partitionable_model.routing_table_name
+
+ def self.routing_class?
+ true
+ end
+
+ def self.sti_name
+ superclass.sti_name
+ end
+ end
- def self.routing_class?
- true
+ partitionable_model.const_set(:Partitioned, partitioned)
end
end
- base.const_set(:Partitioned, partitioned)
- end
+ def inherited(child_class)
+ super
+ return if Partitionable::MUTEX.owned?
+
+ install_partitioned_class(child_class)
+ end
- class_methods do
def routing_class?
false
end
@@ -51,6 +74,13 @@ module Ci
end
end
end
+
+ def type_condition(table = arel_table)
+ sti_column = table[inheritance_column]
+ sti_names = ([self] + descendants).map(&:sti_name).uniq
+
+ predicate_builder.build(sti_column, sti_names)
+ end
end
end
end
diff --git a/app/models/repository.rb b/app/models/repository.rb
index cd269f928b5..6113f54367d 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -1248,6 +1248,10 @@ class Repository
prohibited_branches.each { |name| raw_repository.delete_branch(name) }
end
+ def get_patch_id(old_revision, new_revision)
+ raw_repository.get_patch_id(old_revision, new_revision)
+ end
+
private
def ancestor_cache_key(ancestor_id, descendant_id)
diff --git a/app/services/metrics/users_starred_dashboards/create_service.rb b/app/services/metrics/users_starred_dashboards/create_service.rb
deleted file mode 100644
index 0d028f120d3..00000000000
--- a/app/services/metrics/users_starred_dashboards/create_service.rb
+++ /dev/null
@@ -1,76 +0,0 @@
-# frozen_string_literal: true
-
-# Create Metrics::UsersStarredDashboard entry for given user based on matched dashboard_path, project
-module Metrics
- module UsersStarredDashboards
- class CreateService < ::BaseService
- include Stepable
-
- steps :authorize_create_action,
- :parse_dashboard_path,
- :create
-
- def initialize(user, project, dashboard_path)
- @user = user
- @project = project
- @dashboard_path = dashboard_path
- end
-
- def execute
- keys = %i[status message starred_dashboard]
- status, message, dashboards = execute_steps.values_at(*keys)
-
- if status != :success
- ServiceResponse.error(message: message)
- else
- ServiceResponse.success(payload: dashboards)
- end
- end
-
- private
-
- attr_reader :user, :project, :dashboard_path
-
- def authorize_create_action(_options)
- if Ability.allowed?(user, :create_metrics_user_starred_dashboard, project)
- success(user: user, project: project)
- else
- error(s_('MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard'))
- end
- end
-
- def parse_dashboard_path(options)
- if dashboard_path_exists?
- options[:dashboard_path] = dashboard_path
- success(options)
- else
- error(s_('MetricsUsersStarredDashboards|Dashboard with requested path can not be found'))
- end
- end
-
- def create(options)
- starred_dashboard = build_starred_dashboard_from(options)
-
- if starred_dashboard.save
- success(starred_dashboard: starred_dashboard)
- else
- error(starred_dashboard.errors.messages)
- end
- end
-
- def build_starred_dashboard_from(options)
- Metrics::UsersStarredDashboard.new(
- user: options.fetch(:user),
- project: options.fetch(:project),
- dashboard_path: options.fetch(:dashboard_path)
- )
- end
-
- def dashboard_path_exists?
- Gitlab::Metrics::Dashboard::Finder
- .find_all_paths(project)
- .any? { |dashboard| dashboard[:path] == dashboard_path }
- end
- end
- end
-end
diff --git a/app/services/metrics/users_starred_dashboards/delete_service.rb b/app/services/metrics/users_starred_dashboards/delete_service.rb
deleted file mode 100644
index 229c0e8cfc0..00000000000
--- a/app/services/metrics/users_starred_dashboards/delete_service.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-# Delete all matching Metrics::UsersStarredDashboard entries for given user based on matched dashboard_path, project
-module Metrics
- module UsersStarredDashboards
- class DeleteService < ::BaseService
- def initialize(user, project, dashboard_path = nil)
- @user = user
- @project = project
- @dashboard_path = dashboard_path
- end
-
- def execute
- ServiceResponse.success(payload: { deleted_rows: starred_dashboards.delete_all })
- end
-
- private
-
- attr_reader :user, :project, :dashboard_path
-
- def starred_dashboards
- # since deleted records are scoped to their owner there is no need to
- # check if that user can delete them, also if user lost access to
- # project it shouldn't block that user from removing them
- dashboards = user.metrics_users_starred_dashboards
-
- if dashboard_path.present?
- dashboards.for_project_dashboard(project, dashboard_path)
- else
- dashboards.for_project(project)
- end
- end
- end
- end
-end
diff --git a/config/feature_flags/development/ci_partitioning_use_ci_builds_routing_table.yml b/config/feature_flags/development/ci_partitioning_use_ci_builds_routing_table.yml
new file mode 100644
index 00000000000..97bacb21e38
--- /dev/null
+++ b/config/feature_flags/development/ci_partitioning_use_ci_builds_routing_table.yml
@@ -0,0 +1,8 @@
+---
+name: ci_partitioning_use_ci_builds_routing_table
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/122919
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/421180
+milestone: '16.3'
+type: development
+group: group::pipeline execution
+default_enabled: false
diff --git a/config/feature_flags/development/code_suggestions_tokens_from_customers_dot.yml b/config/feature_flags/development/code_suggestions_tokens_from_customers_dot.yml
index 4abbd56482c..e91d069ba3c 100644
--- a/config/feature_flags/development/code_suggestions_tokens_from_customers_dot.yml
+++ b/config/feature_flags/development/code_suggestions_tokens_from_customers_dot.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/417762
milestone: '16.3'
type: development
group: group::application performance
-default_enabled: false
+default_enabled: true
diff --git a/config/feature_flags/development/self_managed_code_suggestions_completion_api.yml b/config/feature_flags/development/self_managed_code_suggestions_completion_api.yml
index 7760be2370f..a0321e1f145 100644
--- a/config/feature_flags/development/self_managed_code_suggestions_completion_api.yml
+++ b/config/feature_flags/development/self_managed_code_suggestions_completion_api.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/418795
milestone: '16.3'
type: development
group: group::application performance
-default_enabled: false
+default_enabled: true
diff --git a/config/gitlab_loose_foreign_keys.yml b/config/gitlab_loose_foreign_keys.yml
index 3da9e4fd184..bf99eeceb2d 100644
--- a/config/gitlab_loose_foreign_keys.yml
+++ b/config/gitlab_loose_foreign_keys.yml
@@ -22,16 +22,6 @@ ci_build_report_results:
- table: projects
column: project_id
on_delete: async_delete
-ci_builds:
- - table: users
- column: user_id
- on_delete: async_nullify
- - table: projects
- column: project_id
- on_delete: async_delete
- - table: ci_runners
- column: runner_id
- on_delete: async_nullify
ci_daily_build_group_report_results:
- table: namespaces
column: group_id
@@ -260,6 +250,16 @@ namespaces:
- table: organizations
column: organization_id
on_delete: async_nullify
+p_ci_builds:
+ - table: users
+ column: user_id
+ on_delete: async_nullify
+ - table: projects
+ column: project_id
+ on_delete: async_delete
+ - table: ci_runners
+ column: runner_id
+ on_delete: async_nullify
p_ci_builds_metadata:
- table: projects
column: project_id
diff --git a/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml b/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml
index 41383bbed2b..34cb10f08d0 100644
--- a/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml
+++ b/config/metrics/counts_28d/20210216175405_clusters_applications_cert_managers.yml
@@ -17,7 +17,6 @@ tier:
- free
- premium
- ultimate
-name: 'count_distinct_user_id_from_clusters_applications_cert_managers'
performance_indicator_type: []
milestone: "<13.9"
milestone_removed: "14.4"
diff --git a/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml b/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml
index 24e70eddbe5..44b46f9c013 100644
--- a/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml
+++ b/config/metrics/counts_28d/20210216175407_clusters_applications_helm.yml
@@ -17,7 +17,6 @@ tier:
- free
- premium
- ultimate
-name: 'count_distinct_user_id_from_clusters_applications_helm'
performance_indicator_type: []
milestone: "<13.9"
milestone_removed: "14.4"
diff --git a/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml b/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml
index 3a846b8016a..abf90e57eec 100644
--- a/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml
+++ b/config/metrics/counts_28d/20210216175409_clusters_applications_ingress.yml
@@ -17,7 +17,6 @@ tier:
- free
- premium
- ultimate
-name: 'count_distinct_user_id_from_clusters_applications_ingress'
performance_indicator_type: []
milestone: "<13.9"
milestone_removed: "14.4"
diff --git a/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml b/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml
index 75e14e36b4d..885f9903247 100644
--- a/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml
+++ b/config/metrics/counts_28d/20210216175411_clusters_applications_knative.yml
@@ -17,7 +17,6 @@ tier:
- free
- premium
- ultimate
-name: 'count_distinct_user_id_from_clusters_applications_knative'
performance_indicator_type: []
milestone: "<13.9"
milestone_removed: "14.4"
diff --git a/config/metrics/counts_28d/20210216175413_clusters_management_project.yml b/config/metrics/counts_28d/20210216175413_clusters_management_project.yml
index 8ea669437ff..286c5401068 100644
--- a/config/metrics/counts_28d/20210216175413_clusters_management_project.yml
+++ b/config/metrics/counts_28d/20210216175413_clusters_management_project.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: usage_activity_by_stage_monthly.configure.clusters_management_project
-name: count_distinct_user_id_from_management_project_clusters
description: Number of Kubernetes clusters with clusters management project being
set
product_section: ops
diff --git a/config/metrics/counts_28d/20210216175415_clusters_disabled.yml b/config/metrics/counts_28d/20210216175415_clusters_disabled.yml
index 39f8bf477c5..ca1c2bb72ad 100644
--- a/config/metrics/counts_28d/20210216175415_clusters_disabled.yml
+++ b/config/metrics/counts_28d/20210216175415_clusters_disabled.yml
@@ -17,6 +17,5 @@ tier:
- free
- premium
- ultimate
-name: 'count_distinct_user_id_from_disabled_clusters'
performance_indicator_type: []
milestone: "<13.9"
diff --git a/config/metrics/counts_28d/20210216175417_clusters_enabled.yml b/config/metrics/counts_28d/20210216175417_clusters_enabled.yml
index 50e38523ade..ec116c7c2ac 100644
--- a/config/metrics/counts_28d/20210216175417_clusters_enabled.yml
+++ b/config/metrics/counts_28d/20210216175417_clusters_enabled.yml
@@ -17,6 +17,5 @@ tier:
- free
- premium
- ultimate
-name: 'count_distinct_user_id_from_enabled_clusters'
performance_indicator_type: []
milestone: "<13.9"
diff --git a/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml b/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml
index f9f7e4137c9..db348e8ffb0 100644
--- a/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml
+++ b/config/metrics/counts_28d/20210216175419_clusters_platforms_gke.yml
@@ -17,6 +17,5 @@ tier:
- free
- premium
- ultimate
-name: 'count_distinct_user_id_from_cluster_providers_gcp'
performance_indicator_type: []
milestone: "<13.9"
diff --git a/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml b/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml
index 855b5f12fac..cb1b6b9e9e8 100644
--- a/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml
+++ b/config/metrics/counts_28d/20210216175420_clusters_platforms_eks.yml
@@ -17,6 +17,5 @@ tier:
- free
- premium
- ultimate
-name: 'count_distinct_user_id_from_cluster_providers_aws'
performance_indicator_type: []
milestone: "<13.9"
diff --git a/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml b/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml
index 7c0560448e7..17331ea5882 100644
--- a/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml
+++ b/config/metrics/counts_28d/20210216175422_clusters_platforms_user.yml
@@ -17,6 +17,5 @@ tier:
- free
- premium
- ultimate
-name: 'count_distinct_user_id_from_user_provisioned_clusters'
performance_indicator_type: []
milestone: "<13.9"
diff --git a/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml b/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml
index 1946b6cc1a6..5f4afa58ac9 100644
--- a/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml
+++ b/config/metrics/counts_28d/20210216175424_instance_clusters_disabled.yml
@@ -17,6 +17,5 @@ tier:
- free
- premium
- ultimate
-name: 'count_distinct_user_id_from_disabled_clusters_attached_to_instance'
performance_indicator_type: []
milestone: "<13.9"
diff --git a/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml b/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml
index 139ca314e17..6c750370bba 100644
--- a/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml
+++ b/config/metrics/counts_28d/20210216175426_instance_clusters_enabled.yml
@@ -17,6 +17,5 @@ tier:
- free
- premium
- ultimate
-name: 'count_distinct_user_id_from_enabaled_clusters_attached_to_instance'
performance_indicator_type: []
milestone: "<13.9"
diff --git a/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml b/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml
index 284d0ebd945..3eb3b05b0be 100644
--- a/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml
+++ b/config/metrics/counts_28d/20210216175428_group_clusters_disabled.yml
@@ -17,6 +17,5 @@ tier:
- free
- premium
- ultimate
-name: 'count_distinct_user_id_from_clusters_attached_to_groups'
performance_indicator_type: []
milestone: "<13.9"
diff --git a/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml b/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml
index 8898c54989e..f7be4ff3e68 100644
--- a/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml
+++ b/config/metrics/counts_28d/20210216175430_group_clusters_enabled.yml
@@ -17,6 +17,5 @@ tier:
- free
- premium
- ultimate
-name: 'count_distinct_user_id_from_enabled_clusters_attached_to_groups'
performance_indicator_type: []
milestone: "<13.9"
diff --git a/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml b/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml
index b0b2c0e76a5..eac8e143217 100644
--- a/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml
+++ b/config/metrics/counts_28d/20210216175432_project_clusters_disabled.yml
@@ -17,6 +17,5 @@ tier:
- free
- premium
- ultimate
-name: 'count_distinct_user_id_from_disabled_clusters_attached_to_projects'
performance_indicator_type: []
milestone: "<13.9"
diff --git a/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml b/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml
index b027957e130..6e297a3bb8e 100644
--- a/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml
+++ b/config/metrics/counts_28d/20210216175434_project_clusters_enabled.yml
@@ -17,7 +17,6 @@ tier:
- free
- premium
- ultimate
-name: 'count_distinct_user_id_from_enabled_clusters_attached_to_projects'
performance_indicator_type:
- customer_health_score
milestone: "<13.9"
diff --git a/config/metrics/counts_28d/20210216180317_snippets.yml b/config/metrics/counts_28d/20210216180317_snippets.yml
index e2f08a5730e..5882894c3f5 100644
--- a/config/metrics/counts_28d/20210216180317_snippets.yml
+++ b/config/metrics/counts_28d/20210216180317_snippets.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: usage_activity_by_stage_monthly.create.snippets
-name: count_distinct_author_id_from_snippets
description: Count of distinct author_id from snippets for last 28 days
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_28d/20210514013545_i_code_review_user_resolve_conflict_monthly.yml b/config/metrics/counts_28d/20210514013545_i_code_review_user_resolve_conflict_monthly.yml
index 6cee7067b48..360190609d6 100644
--- a/config/metrics/counts_28d/20210514013545_i_code_review_user_resolve_conflict_monthly.yml
+++ b/config/metrics/counts_28d/20210514013545_i_code_review_user_resolve_conflict_monthly.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: redis_hll_counters.code_review.i_code_review_user_resolve_conflict_monthly
-name: resolve_conflict
description: Count of unique users per week who attempt to resolve a conflict through the ui
product_stage: create
product_group: code_review
diff --git a/config/metrics/counts_28d/20210514013549_i_code_review_user_load_conflict_ui_monthly.yml b/config/metrics/counts_28d/20210514013549_i_code_review_user_load_conflict_ui_monthly.yml
index b25a9344eda..bacd72f2c86 100644
--- a/config/metrics/counts_28d/20210514013549_i_code_review_user_load_conflict_ui_monthly.yml
+++ b/config/metrics/counts_28d/20210514013549_i_code_review_user_load_conflict_ui_monthly.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: redis_hll_counters.code_review.i_code_review_user_load_conflict_ui_monthly
-name: load_conflict_ui
description: Count of unique users per week who load the conflict resolution page
product_stage: create
product_group: code_review
diff --git a/config/metrics/counts_28d/20210816143831_i_code_review_total_suggestions_added_monthly.yml b/config/metrics/counts_28d/20210816143831_i_code_review_total_suggestions_added_monthly.yml
index 31609397e5e..1f4e20c1fd0 100644
--- a/config/metrics/counts_28d/20210816143831_i_code_review_total_suggestions_added_monthly.yml
+++ b/config/metrics/counts_28d/20210816143831_i_code_review_total_suggestions_added_monthly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_total_suggestions_added_monthly
-name: "count_notes_with_suggestions_monthly"
description: Total number of monthly suggestions
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_28d/20210816144453_i_code_review_total_suggestions_applied_monthly.yml b/config/metrics/counts_28d/20210816144453_i_code_review_total_suggestions_applied_monthly.yml
index 9ad967fd5f6..62011a10bcb 100644
--- a/config/metrics/counts_28d/20210816144453_i_code_review_total_suggestions_applied_monthly.yml
+++ b/config/metrics/counts_28d/20210816144453_i_code_review_total_suggestions_applied_monthly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_total_suggestions_applied_monthly
-name: "count_notes_with_applied_suggestions_monthly"
description: Total number of monthly suggestions applied
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_28d/20210908150458_i_code_review_user_resolve_thread_in_issue_monthly.yml b/config/metrics/counts_28d/20210908150458_i_code_review_user_resolve_thread_in_issue_monthly.yml
index 370c12cdc43..530aab772f3 100644
--- a/config/metrics/counts_28d/20210908150458_i_code_review_user_resolve_thread_in_issue_monthly.yml
+++ b/config/metrics/counts_28d/20210908150458_i_code_review_user_resolve_thread_in_issue_monthly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_user_resolve_thread_in_issue_monthly
-name: resolve_thread_in_issue
description: The number of users who resolve a thread in a new issue through the MR page monthly
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_28d/20210910132229_user_auth_by_provider.yml b/config/metrics/counts_28d/20210910132229_user_auth_by_provider.yml
index 14914a140d4..791d4896e86 100644
--- a/config/metrics/counts_28d/20210910132229_user_auth_by_provider.yml
+++ b/config/metrics/counts_28d/20210910132229_user_auth_by_provider.yml
@@ -1,6 +1,5 @@
---
key_path: usage_activity_by_stage_monthly.manage.user_auth_by_provider
-name: count_distinct_users_using_two_factor_authentication
description: Number of unique user logins using two factor authentication for available providers
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_28d/20210916080405_promoted_issues.yml b/config/metrics/counts_28d/20210916080405_promoted_issues.yml
index 30227589a0e..cfbc0d2655c 100644
--- a/config/metrics/counts_28d/20210916080405_promoted_issues.yml
+++ b/config/metrics/counts_28d/20210916080405_promoted_issues.yml
@@ -1,6 +1,5 @@
---
key_path: counts_monthly.promoted_issues
-name: count_promoted_issues
description: Count of issues promoted to epics
product_section: analytics
product_stage: analytics
diff --git a/config/metrics/counts_28d/20211118200530_p_ci_templates_security_dast_on_demand_api_scan_monthly.yml b/config/metrics/counts_28d/20211118200530_p_ci_templates_security_dast_on_demand_api_scan_monthly.yml
index b15681e4ec9..22e5aa42254 100644
--- a/config/metrics/counts_28d/20211118200530_p_ci_templates_security_dast_on_demand_api_scan_monthly.yml
+++ b/config/metrics/counts_28d/20211118200530_p_ci_templates_security_dast_on_demand_api_scan_monthly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.ci_templates.p_ci_templates_security_dast_on_demand_api_scan_monthly
-name: "dast_on_demand_api_scan"
description: Count of pipelines using the latest DAST API template
product_section: sec
product_stage: secure
diff --git a/config/metrics/counts_28d/20220504150641_count_notes_in_ipynb_diff_commit_monthly.yml b/config/metrics/counts_28d/20220504150641_count_notes_in_ipynb_diff_commit_monthly.yml
index 937c4039c27..5e4ea495da2 100644
--- a/config/metrics/counts_28d/20220504150641_count_notes_in_ipynb_diff_commit_monthly.yml
+++ b/config/metrics/counts_28d/20220504150641_count_notes_in_ipynb_diff_commit_monthly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_count_notes_in_ipynb_diff_commit_monthly
-name: "count_notes_in_ipynb_diff_commit_monthly"
description: Monthly notes on ipynb commit diffs
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_28d/20220504150641_count_notes_in_ipynb_diff_monthly.yml b/config/metrics/counts_28d/20220504150641_count_notes_in_ipynb_diff_monthly.yml
index 8f6435909ab..c8efa998c6d 100644
--- a/config/metrics/counts_28d/20220504150641_count_notes_in_ipynb_diff_monthly.yml
+++ b/config/metrics/counts_28d/20220504150641_count_notes_in_ipynb_diff_monthly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_count_notes_in_ipynb_diff_monthly
-name: "count_notes_in_ipynb_diff_monthly"
description: Monthly notes on ipynb diffs
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_28d/20220504150641_count_notes_in_ipynb_diff_mr_monthly.yml b/config/metrics/counts_28d/20220504150641_count_notes_in_ipynb_diff_mr_monthly.yml
index 3d52754312e..e04f66dfd28 100644
--- a/config/metrics/counts_28d/20220504150641_count_notes_in_ipynb_diff_mr_monthly.yml
+++ b/config/metrics/counts_28d/20220504150641_count_notes_in_ipynb_diff_mr_monthly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_count_notes_in_ipynb_diff_mr_monthly
-name: "count_notes_in_ipynb_diff_mr_monthly"
description: Monthly notes on ipynb MR diffs
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_28d/20220504150641_count_users_with_notes_in_ipynb_diff_commit_monthly.yml b/config/metrics/counts_28d/20220504150641_count_users_with_notes_in_ipynb_diff_commit_monthly.yml
index 38face8ecd6..7f3853ea6a8 100644
--- a/config/metrics/counts_28d/20220504150641_count_users_with_notes_in_ipynb_diff_commit_monthly.yml
+++ b/config/metrics/counts_28d/20220504150641_count_users_with_notes_in_ipynb_diff_commit_monthly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_count_users_with_notes_in_ipynb_diff_commit_monthly
-name: "count_users_with_notes_in_ipynb_diff_commit_monthly"
description: Monthly unique users with notes on ipynb commit diffs
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_28d/20220504150641_count_users_with_notes_in_ipynb_diff_monthly.yml b/config/metrics/counts_28d/20220504150641_count_users_with_notes_in_ipynb_diff_monthly.yml
index a04ec7b91b2..ddec7d8b47e 100644
--- a/config/metrics/counts_28d/20220504150641_count_users_with_notes_in_ipynb_diff_monthly.yml
+++ b/config/metrics/counts_28d/20220504150641_count_users_with_notes_in_ipynb_diff_monthly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_count_users_with_notes_in_ipynb_diff_monthly
-name: "count_users_with_notes_in_ipynb_diff_monthly"
description: Monthly unique users with notes on ipynb diffs
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_28d/20220504150641_count_users_with_notes_in_ipynb_diff_mr_monthly.yml b/config/metrics/counts_28d/20220504150641_count_users_with_notes_in_ipynb_diff_mr_monthly.yml
index 133601115e0..22a91b115b3 100644
--- a/config/metrics/counts_28d/20220504150641_count_users_with_notes_in_ipynb_diff_mr_monthly.yml
+++ b/config/metrics/counts_28d/20220504150641_count_users_with_notes_in_ipynb_diff_mr_monthly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_count_users_with_notes_in_ipynb_diff_mr_monthly
-name: "count_users_with_notes_in_ipynb_diff_mr_monthly"
description: Monthly unique users with notes on ipynb MR diffs
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_28d/20220525231314_unique_monthly_active_users.yml b/config/metrics/counts_28d/20220525231314_unique_monthly_active_users.yml
index 6fdaf8c5b2c..bb2e8bd8453 100644
--- a/config/metrics/counts_28d/20220525231314_unique_monthly_active_users.yml
+++ b/config/metrics/counts_28d/20220525231314_unique_monthly_active_users.yml
@@ -1,6 +1,5 @@
---
key_path: counts_monthly.unique_active_users
-name:
description: Users that have a last_activity_on date within the past 28 days
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_28d/20220615103718_incident_management_timeline_event_total_unique_counts_monthly.yml b/config/metrics/counts_28d/20220615103718_incident_management_timeline_event_total_unique_counts_monthly.yml
index e007180b831..b3420789426 100644
--- a/config/metrics/counts_28d/20220615103718_incident_management_timeline_event_total_unique_counts_monthly.yml
+++ b/config/metrics/counts_28d/20220615103718_incident_management_timeline_event_total_unique_counts_monthly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.incident_management.timeline_event_total_unique_counts_monthly
-name: count_unique_users_interacting_with_timeline_events_monthly
description: Counts unique users for timeline events create, edit and delete events per month
product_section: ops
product_stage: monitor
diff --git a/config/metrics/counts_28d/20220622084700_p_analytics_ci_cd_time_to_restore_service_monthly.yml b/config/metrics/counts_28d/20220622084700_p_analytics_ci_cd_time_to_restore_service_monthly.yml
index 4527fcd125a..827fea6fed6 100644
--- a/config/metrics/counts_28d/20220622084700_p_analytics_ci_cd_time_to_restore_service_monthly.yml
+++ b/config/metrics/counts_28d/20220622084700_p_analytics_ci_cd_time_to_restore_service_monthly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.analytics.p_analytics_ci_cd_time_to_restore_service_monthly
-name: p_analytics_ci_cd_time_to_restore_service_monthly
description: Count of unique visits to the project level CI/CD Analytics Time to restore service tab
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_28d/20220707022802_users_updating_weight_estimate_monthly.yml b/config/metrics/counts_28d/20220707022802_users_updating_weight_estimate_monthly.yml
index ce8f461d5a2..fb8411e6377 100644
--- a/config/metrics/counts_28d/20220707022802_users_updating_weight_estimate_monthly.yml
+++ b/config/metrics/counts_28d/20220707022802_users_updating_weight_estimate_monthly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.work_items.users_updating_weight_estimate_monthly
-name: users_updating_weight_estimate_monthly
description: Unique users updating a work item's weight estimate
product_section: dev
product_stage: plan
diff --git a/config/metrics/counts_28d/20220707054530_p_analytics_ci_cd_change_failure_rate_monthly.yml b/config/metrics/counts_28d/20220707054530_p_analytics_ci_cd_change_failure_rate_monthly.yml
index b63e7d6f535..7f05692d1e6 100644
--- a/config/metrics/counts_28d/20220707054530_p_analytics_ci_cd_change_failure_rate_monthly.yml
+++ b/config/metrics/counts_28d/20220707054530_p_analytics_ci_cd_change_failure_rate_monthly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.analytics.p_analytics_ci_cd_change_failure_rate_monthly
-name: p_analytics_ci_cd_change_failure_rate_monthly
description: Count of unique visits to the project level CI/CD Analytics Change failure rate tab
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_28d/20220907080630_i_quickactions_timeline_monthly.yml b/config/metrics/counts_28d/20220907080630_i_quickactions_timeline_monthly.yml
index f738e97749a..6ae8f8f9cea 100644
--- a/config/metrics/counts_28d/20220907080630_i_quickactions_timeline_monthly.yml
+++ b/config/metrics/counts_28d/20220907080630_i_quickactions_timeline_monthly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.quickactions.i_quickactions_timeline_monthly
-name: quickactions_timeline_monthly
description: Count of MAU using the `/timeline` quick action
product_section: ops
product_stage: monitor
diff --git a/config/metrics/counts_28d/20221006065524_i_quickactions_link_monthly.yml b/config/metrics/counts_28d/20221006065524_i_quickactions_link_monthly.yml
index ab17a29c2e6..7bc0c5f6e12 100644
--- a/config/metrics/counts_28d/20221006065524_i_quickactions_link_monthly.yml
+++ b/config/metrics/counts_28d/20221006065524_i_quickactions_link_monthly.yml
@@ -1,5 +1,4 @@
key_path: redis_hll_counters.quickactions.i_quickactions_link_monthly
-name: quickactions_timeline_monthly
description: Count of MAU using the `/link` quick action
product_section: ops
product_stage: monitor
diff --git a/config/metrics/counts_28d/20230120094644_g_runner_fleet_read_jobs_statistics_monthly.yml b/config/metrics/counts_28d/20230120094644_g_runner_fleet_read_jobs_statistics_monthly.yml
index d3e28450d1a..2dfd94dc5ad 100644
--- a/config/metrics/counts_28d/20230120094644_g_runner_fleet_read_jobs_statistics_monthly.yml
+++ b/config/metrics/counts_28d/20230120094644_g_runner_fleet_read_jobs_statistics_monthly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.runner.g_runner_fleet_read_jobs_statistics_monthly
-name: g_runner_fleet_read_jobs_statistics_monthly
description: Count of unique users (monthly) who read runner job statistics
product_section: ops
product_stage: verify
diff --git a/config/metrics/counts_7d/20210428142406_users_viewing_analytics_group_devops_adoption.yml b/config/metrics/counts_7d/20210428142406_users_viewing_analytics_group_devops_adoption.yml
index d6813b33e39..dd63e074e49 100644
--- a/config/metrics/counts_7d/20210428142406_users_viewing_analytics_group_devops_adoption.yml
+++ b/config/metrics/counts_7d/20210428142406_users_viewing_analytics_group_devops_adoption.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: analytics_unique_visits.users_viewing_analytics_group_devops_adoption
-name: unique_users_viewing_analytics_group_devops_adoption
description: Unique users viewing analytics group devops adoption
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_7d/20210514013544_i_code_review_user_load_conflict_ui_weekly.yml b/config/metrics/counts_7d/20210514013544_i_code_review_user_load_conflict_ui_weekly.yml
index 556c1467b43..6d082cd32ce 100644
--- a/config/metrics/counts_7d/20210514013544_i_code_review_user_load_conflict_ui_weekly.yml
+++ b/config/metrics/counts_7d/20210514013544_i_code_review_user_load_conflict_ui_weekly.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: redis_hll_counters.code_review.i_code_review_user_load_conflict_ui_weekly
-name: load_conflict_ui
description: Count of unique users per week who load the conflict resolution page
product_section: 'TBD'
product_stage: create
diff --git a/config/metrics/counts_7d/20210514013545_i_code_review_user_resolve_conflict_weekly.yml b/config/metrics/counts_7d/20210514013545_i_code_review_user_resolve_conflict_weekly.yml
index cd4e487f982..6586dd1b932 100644
--- a/config/metrics/counts_7d/20210514013545_i_code_review_user_resolve_conflict_weekly.yml
+++ b/config/metrics/counts_7d/20210514013545_i_code_review_user_resolve_conflict_weekly.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: redis_hll_counters.code_review.i_code_review_user_resolve_conflict_weekly
-name: resolve_conflict
description: Count of unique users per week who attempt to resolve a conflict through the ui
product_section: 'TBD'
product_stage: create
diff --git a/config/metrics/counts_7d/20210816144119_i_code_review_total_suggestions_added_weekly.yml b/config/metrics/counts_7d/20210816144119_i_code_review_total_suggestions_added_weekly.yml
index 59b0cfbc6cb..65e49160611 100644
--- a/config/metrics/counts_7d/20210816144119_i_code_review_total_suggestions_added_weekly.yml
+++ b/config/metrics/counts_7d/20210816144119_i_code_review_total_suggestions_added_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_total_suggestions_added_weekly
-name: "count_notes_with_suggestions_weekly"
description: Total number of weekly suggestions
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_7d/20210816144247_i_code_review_total_suggestions_applied_weekly.yml b/config/metrics/counts_7d/20210816144247_i_code_review_total_suggestions_applied_weekly.yml
index ae67e0bf6f5..617586b9bb4 100644
--- a/config/metrics/counts_7d/20210816144247_i_code_review_total_suggestions_applied_weekly.yml
+++ b/config/metrics/counts_7d/20210816144247_i_code_review_total_suggestions_applied_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_total_suggestions_applied_weekly
-name: "count_notes_with_applied_suggestions_weekly"
description: Total number of weekly suggestions applied
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_7d/20210908151645_i_code_review_user_resolve_thread_in_issue_weekly.yml b/config/metrics/counts_7d/20210908151645_i_code_review_user_resolve_thread_in_issue_weekly.yml
index fd4284a8a3b..1f7b00cf278 100644
--- a/config/metrics/counts_7d/20210908151645_i_code_review_user_resolve_thread_in_issue_weekly.yml
+++ b/config/metrics/counts_7d/20210908151645_i_code_review_user_resolve_thread_in_issue_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_user_resolve_thread_in_issue_weekly
-name: resolve_thread_in_issue
description: The number of users who resolve a thread in a new issue through the MR page weekly
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml b/config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml
index 084286a3a70..9f08bac4531 100644
--- a/config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml
+++ b/config/metrics/counts_7d/20210916102312_templates_gitlab_slack_application_active.yml
@@ -1,6 +1,5 @@
---
key_path: counts.templates_gitlab_slack_application_active
-name: count_templates_gitlab_slack_application_active
description: Count templates with active slack application
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_7d/20211118200524_p_ci_templates_security_dast_on_demand_api_scan_weekly.yml b/config/metrics/counts_7d/20211118200524_p_ci_templates_security_dast_on_demand_api_scan_weekly.yml
index 8509bf20835..e1f56f981ed 100644
--- a/config/metrics/counts_7d/20211118200524_p_ci_templates_security_dast_on_demand_api_scan_weekly.yml
+++ b/config/metrics/counts_7d/20211118200524_p_ci_templates_security_dast_on_demand_api_scan_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.ci_templates.p_ci_templates_security_dast_on_demand_api_scan_weekly
-name: "dast_on_demand_api_scan"
description: Count of pipelines using the latest DAST API template
product_section: sec
product_stage: secure
diff --git a/config/metrics/counts_7d/20220504150641_count_notes_in_ipynb_diff_commit_weekly.yml b/config/metrics/counts_7d/20220504150641_count_notes_in_ipynb_diff_commit_weekly.yml
index b84da226e29..6635545781b 100644
--- a/config/metrics/counts_7d/20220504150641_count_notes_in_ipynb_diff_commit_weekly.yml
+++ b/config/metrics/counts_7d/20220504150641_count_notes_in_ipynb_diff_commit_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_count_notes_in_ipynb_diff_commit_weekly
-name: "count_notes_in_ipynb_diff_commit_weekly"
description: Weekly notes on ipynb commit diffs
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_7d/20220504150641_count_notes_in_ipynb_diff_mr_weekly.yml b/config/metrics/counts_7d/20220504150641_count_notes_in_ipynb_diff_mr_weekly.yml
index 9d88e9729dd..661c6ab3f59 100644
--- a/config/metrics/counts_7d/20220504150641_count_notes_in_ipynb_diff_mr_weekly.yml
+++ b/config/metrics/counts_7d/20220504150641_count_notes_in_ipynb_diff_mr_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_count_notes_in_ipynb_diff_mr_weekly
-name: "count_notes_in_ipynb_diff_mr_weekly"
description: Weekly notes on ipynb MR diffs
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_7d/20220504150641_count_notes_in_ipynb_diff_weekly.yml b/config/metrics/counts_7d/20220504150641_count_notes_in_ipynb_diff_weekly.yml
index 16ef1a12d45..33e27d26c2f 100644
--- a/config/metrics/counts_7d/20220504150641_count_notes_in_ipynb_diff_weekly.yml
+++ b/config/metrics/counts_7d/20220504150641_count_notes_in_ipynb_diff_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_count_notes_in_ipynb_diff_weekly
-name: "count_notes_in_ipynb_diff_weekly"
description: Weekly notes on ipynb diffs
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_7d/20220504150641_count_users_with_notes_in_ipynb_diff_commit_weekly.yml b/config/metrics/counts_7d/20220504150641_count_users_with_notes_in_ipynb_diff_commit_weekly.yml
index 898355e90ff..f5419fd1e8b 100644
--- a/config/metrics/counts_7d/20220504150641_count_users_with_notes_in_ipynb_diff_commit_weekly.yml
+++ b/config/metrics/counts_7d/20220504150641_count_users_with_notes_in_ipynb_diff_commit_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_count_users_with_notes_in_ipynb_diff_commit_weekly
-name: "count_users_with_notes_in_ipynb_diff_commit_weekly"
description: Weekly unique users with notes on ipynb commit diffs
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_7d/20220504150641_count_users_with_notes_in_ipynb_diff_mr_weekly.yml b/config/metrics/counts_7d/20220504150641_count_users_with_notes_in_ipynb_diff_mr_weekly.yml
index a826b41f7d7..e510930d660 100644
--- a/config/metrics/counts_7d/20220504150641_count_users_with_notes_in_ipynb_diff_mr_weekly.yml
+++ b/config/metrics/counts_7d/20220504150641_count_users_with_notes_in_ipynb_diff_mr_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_count_users_with_notes_in_ipynb_diff_mr_weekly
-name: "count_users_with_notes_in_ipynb_diff_mr_weekly"
description: Weekly unique users with notes on ipynb MR diffs
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_7d/20220504150641_count_users_with_notes_in_ipynb_diff_weekly.yml b/config/metrics/counts_7d/20220504150641_count_users_with_notes_in_ipynb_diff_weekly.yml
index dfc5b66a064..eeca0986739 100644
--- a/config/metrics/counts_7d/20220504150641_count_users_with_notes_in_ipynb_diff_weekly.yml
+++ b/config/metrics/counts_7d/20220504150641_count_users_with_notes_in_ipynb_diff_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.code_review.i_code_review_count_users_with_notes_in_ipynb_diff_weekly
-name: "count_users_with_notes_in_ipynb_diff_weekly"
description: Weekly unique users with notes on ipynb diffs
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_7d/20220615103711_incident_management_timeline_event_total_unique_counts_weekly.yml b/config/metrics/counts_7d/20220615103711_incident_management_timeline_event_total_unique_counts_weekly.yml
index 1c2ed03537f..20c36d459c3 100644
--- a/config/metrics/counts_7d/20220615103711_incident_management_timeline_event_total_unique_counts_weekly.yml
+++ b/config/metrics/counts_7d/20220615103711_incident_management_timeline_event_total_unique_counts_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.incident_management.timeline_event_total_unique_counts_weekly
-name: count_unique_users_interacting_with_timeline_events_weekly
description: Counts unique users for timeline events create, edit and delete events per month
product_section: ops
product_stage: monitor
diff --git a/config/metrics/counts_7d/20220622084654_p_analytics_ci_cd_time_to_restore_service_weekly.yml b/config/metrics/counts_7d/20220622084654_p_analytics_ci_cd_time_to_restore_service_weekly.yml
index a06e08f99bf..face6cc40ca 100644
--- a/config/metrics/counts_7d/20220622084654_p_analytics_ci_cd_time_to_restore_service_weekly.yml
+++ b/config/metrics/counts_7d/20220622084654_p_analytics_ci_cd_time_to_restore_service_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.analytics.p_analytics_ci_cd_time_to_restore_service_weekly
-name: p_analytics_ci_cd_time_to_restore_service_weekly
description: Count of unique visits to the project level CI/CD Analytics Time to restore service tab
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_7d/20220707022758_users_updating_weight_estimate_weekly.yml b/config/metrics/counts_7d/20220707022758_users_updating_weight_estimate_weekly.yml
index e3f0768417b..9c2272233fb 100644
--- a/config/metrics/counts_7d/20220707022758_users_updating_weight_estimate_weekly.yml
+++ b/config/metrics/counts_7d/20220707022758_users_updating_weight_estimate_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.work_items.users_updating_weight_estimate_weekly
-name: users_updating_weight_estimate_weekly
description: Unique users updating a work item's weight estimate
product_section: dev
product_stage: plan
diff --git a/config/metrics/counts_7d/20220707054526_p_analytics_ci_cd_change_failure_rate_weekly.yml b/config/metrics/counts_7d/20220707054526_p_analytics_ci_cd_change_failure_rate_weekly.yml
index 5bc4d01026b..e62316ce40a 100644
--- a/config/metrics/counts_7d/20220707054526_p_analytics_ci_cd_change_failure_rate_weekly.yml
+++ b/config/metrics/counts_7d/20220707054526_p_analytics_ci_cd_change_failure_rate_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.analytics.p_analytics_ci_cd_change_failure_rate_weekly
-name: p_analytics_ci_cd_change_failure_rate_weekly
description: Count of unique visits to the project level CI/CD Analytics Change failure rate tab
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_7d/20220907080626_i_quickactions_timeline_weekly.yml b/config/metrics/counts_7d/20220907080626_i_quickactions_timeline_weekly.yml
index eec7b533960..09d55dd539b 100644
--- a/config/metrics/counts_7d/20220907080626_i_quickactions_timeline_weekly.yml
+++ b/config/metrics/counts_7d/20220907080626_i_quickactions_timeline_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.quickactions.i_quickactions_timeline_weekly
-name: quickactions_timeline_weekly
description: Count of WAU using the `/timeline` quick action
product_section: ops
product_stage: monitor
diff --git a/config/metrics/counts_7d/20221006065521_i_quickactions_link_weekly.yml b/config/metrics/counts_7d/20221006065521_i_quickactions_link_weekly.yml
index 50a6e17a902..ef67ff956f2 100644
--- a/config/metrics/counts_7d/20221006065521_i_quickactions_link_weekly.yml
+++ b/config/metrics/counts_7d/20221006065521_i_quickactions_link_weekly.yml
@@ -1,5 +1,4 @@
key_path: redis_hll_counters.quickactions.i_quickactions_link_weekly
-name: quickactions_timeline_weekly
description: Count of WAU using the `/link` quick action
product_section: ops
product_stage: monitor
diff --git a/config/metrics/counts_7d/20230120094643_g_runner_fleet_read_jobs_statistics_weekly.yml b/config/metrics/counts_7d/20230120094643_g_runner_fleet_read_jobs_statistics_weekly.yml
index 20e1bb4cb8a..debcc2cbd75 100644
--- a/config/metrics/counts_7d/20230120094643_g_runner_fleet_read_jobs_statistics_weekly.yml
+++ b/config/metrics/counts_7d/20230120094643_g_runner_fleet_read_jobs_statistics_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.runner.g_runner_fleet_read_jobs_statistics_weekly
-name: g_runner_fleet_read_jobs_statistics_weekly
description: Count of unique users (weekly) who read runner job statistics
product_section: ops
product_stage: verify
diff --git a/config/metrics/counts_7d/20230509085219_i_quickactions_blocked_by_weekly.yml b/config/metrics/counts_7d/20230509085219_i_quickactions_blocked_by_weekly.yml
index d4406527dbd..1fb82a45976 100644
--- a/config/metrics/counts_7d/20230509085219_i_quickactions_blocked_by_weekly.yml
+++ b/config/metrics/counts_7d/20230509085219_i_quickactions_blocked_by_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.quickactions.i_quickactions_blocked_by_weekly
-name: quickactions_blocked_by_weekly
description: Count of MAU using the `/blocked_by` quick action
product_section: dev
product_stage: plan
diff --git a/config/metrics/counts_7d/20230509090906_i_quickactions_blocks_weekly.yml b/config/metrics/counts_7d/20230509090906_i_quickactions_blocks_weekly.yml
index 3d5b8ed6ce2..bb14f26dbe5 100644
--- a/config/metrics/counts_7d/20230509090906_i_quickactions_blocks_weekly.yml
+++ b/config/metrics/counts_7d/20230509090906_i_quickactions_blocks_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.quickactions.i_quickactions_blocks_weekly
-name: quickactions_blocks_weekly
description: Count of MAU using the `/blocks` quick action
product_section: dev
product_stage: plan
diff --git a/config/metrics/counts_7d/20230607110346_i_quickactions_promote_to_weekly.yml b/config/metrics/counts_7d/20230607110346_i_quickactions_promote_to_weekly.yml
index 995e579e4f6..0f66a0d1796 100644
--- a/config/metrics/counts_7d/20230607110346_i_quickactions_promote_to_weekly.yml
+++ b/config/metrics/counts_7d/20230607110346_i_quickactions_promote_to_weekly.yml
@@ -1,6 +1,5 @@
---
key_path: redis_hll_counters.quickactions.i_quickactions_promote_to_weekly
-name: quickactions_promote_to_weekly
description: Count of WAU using the `/promote_to` quick action
product_section: dev
product_stage: plan
diff --git a/config/metrics/counts_all/20210216180316_snippets.yml b/config/metrics/counts_all/20210216180316_snippets.yml
index 567d0b1d54b..d06ce9ca6f6 100644
--- a/config/metrics/counts_all/20210216180316_snippets.yml
+++ b/config/metrics/counts_all/20210216180316_snippets.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: usage_activity_by_stage.create.snippets
-name: count_distinct_author_id_from_snippets
description: Count of distinct author_id from snippets
product_section: dev
product_stage: create
diff --git a/config/metrics/counts_all/20210502045402_ci_runners_instance_type_active.yml b/config/metrics/counts_all/20210502045402_ci_runners_instance_type_active.yml
index ef969f31496..8f4763dcf55 100644
--- a/config/metrics/counts_all/20210502045402_ci_runners_instance_type_active.yml
+++ b/config/metrics/counts_all/20210502045402_ci_runners_instance_type_active.yml
@@ -1,7 +1,6 @@
---
data_category: operational
key_path: counts.ci_runners_instance_type_active
-name: "count_active_instance_ci_runners"
description: Total active Shared (Instance) Runners
product_section: ops
product_stage: verify
diff --git a/config/metrics/counts_all/20210502050341_ci_runners_group_type_active.yml b/config/metrics/counts_all/20210502050341_ci_runners_group_type_active.yml
index bc5f69f80b7..f04755c7cac 100644
--- a/config/metrics/counts_all/20210502050341_ci_runners_group_type_active.yml
+++ b/config/metrics/counts_all/20210502050341_ci_runners_group_type_active.yml
@@ -1,7 +1,6 @@
---
data_category: operational
key_path: counts.ci_runners_group_type_active
-name: "count_active_group_ci_runners"
description: Total active Group Runners
product_section: ops
product_stage: verify
diff --git a/config/metrics/counts_all/20210502050834_ci_runners_project_type_active.yml b/config/metrics/counts_all/20210502050834_ci_runners_project_type_active.yml
index 054e3f9e524..c3524a57e56 100644
--- a/config/metrics/counts_all/20210502050834_ci_runners_project_type_active.yml
+++ b/config/metrics/counts_all/20210502050834_ci_runners_project_type_active.yml
@@ -1,7 +1,6 @@
---
data_category: operational
key_path: counts.ci_runners_project_type_active
-name: "count_active_project_ci_runners"
description: Total active Specific (Project) Runners
product_section: ops
product_stage: verify
diff --git a/config/metrics/counts_all/20210502050942_ci_runners_online.yml b/config/metrics/counts_all/20210502050942_ci_runners_online.yml
index 4896ddd4699..f3abffce7cb 100644
--- a/config/metrics/counts_all/20210502050942_ci_runners_online.yml
+++ b/config/metrics/counts_all/20210502050942_ci_runners_online.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.ci_runners_online
-name: "counts_online_runners"
description: Total online Runners of all types
product_section: ops
product_stage: verify
diff --git a/config/metrics/counts_all/20210502051651_ci_runners_instance_type_active_online.yml b/config/metrics/counts_all/20210502051651_ci_runners_instance_type_active_online.yml
index 653a4a3917a..5e48c068267 100644
--- a/config/metrics/counts_all/20210502051651_ci_runners_instance_type_active_online.yml
+++ b/config/metrics/counts_all/20210502051651_ci_runners_instance_type_active_online.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.ci_runners_instance_type_active_online
-name: "count_instance_active_online_ci_runners"
description: Total active and online Shared (Instance) Runners
product_section: ops
product_stage: verify
diff --git a/config/metrics/counts_all/20210502051922_ci_runners_group_type_active_online.yml b/config/metrics/counts_all/20210502051922_ci_runners_group_type_active_online.yml
index 53c2c2a8650..380d6411612 100644
--- a/config/metrics/counts_all/20210502051922_ci_runners_group_type_active_online.yml
+++ b/config/metrics/counts_all/20210502051922_ci_runners_group_type_active_online.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.ci_runners_group_type_active_online
-name: "count_group_active_online_ci_runners"
description: Total active and online Group Runners
product_section: ops
product_stage: verify
diff --git a/config/metrics/counts_all/20210502052036_ci_runners_project_type_active_online.yml b/config/metrics/counts_all/20210502052036_ci_runners_project_type_active_online.yml
index 556492214f1..4418d235f5d 100644
--- a/config/metrics/counts_all/20210502052036_ci_runners_project_type_active_online.yml
+++ b/config/metrics/counts_all/20210502052036_ci_runners_project_type_active_online.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.ci_runners_project_type_active_online
-name: "count_project_active_online_ci_runners"
description: Total active and online Specific (Project) Runners
product_section: ops
product_stage: verify
diff --git a/config/metrics/counts_all/20210510201537_in_product_marketing_email_create_0_sent.yml b/config/metrics/counts_all/20210510201537_in_product_marketing_email_create_0_sent.yml
index 022b7b83528..d4d17a6a2b4 100644
--- a/config/metrics/counts_all/20210510201537_in_product_marketing_email_create_0_sent.yml
+++ b/config/metrics/counts_all/20210510201537_in_product_marketing_email_create_0_sent.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_create_0_sent
-name: "count_sent_first_email_of_the_create_track_for_in_product_marketing_emails"
description: Total sent emails of the create track's first email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510201919_in_product_marketing_email_create_0_cta_clicked.yml b/config/metrics/counts_all/20210510201919_in_product_marketing_email_create_0_cta_clicked.yml
index 14a2b4915c0..0b61624c409 100644
--- a/config/metrics/counts_all/20210510201919_in_product_marketing_email_create_0_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510201919_in_product_marketing_email_create_0_cta_clicked.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_create_0_cta_clicked
-name: "count_clicks_on_the_first_email_of_the_create_track_for_in_product_marketing_emails"
description: Total clicks on the create track's first email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510202148_in_product_marketing_email_create_1_sent.yml b/config/metrics/counts_all/20210510202148_in_product_marketing_email_create_1_sent.yml
index 69c0890cb11..c7a38b6a57d 100644
--- a/config/metrics/counts_all/20210510202148_in_product_marketing_email_create_1_sent.yml
+++ b/config/metrics/counts_all/20210510202148_in_product_marketing_email_create_1_sent.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_create_1_sent
-name: "count_sent_second_email_of_the_create_track_for_in_product_marketing_emails"
description: Total sent emails of the create track's second email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510202356_in_product_marketing_email_create_1_cta_clicked.yml b/config/metrics/counts_all/20210510202356_in_product_marketing_email_create_1_cta_clicked.yml
index c084777ed3d..7408554e50f 100644
--- a/config/metrics/counts_all/20210510202356_in_product_marketing_email_create_1_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510202356_in_product_marketing_email_create_1_cta_clicked.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_create_1_cta_clicked
-name: "count_clicks_on_the_second_email_of_the_create_track_for_in_product_marketing_emails"
description: Total clicks on the create track's second email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510202604_in_product_marketing_email_create_2_sent.yml b/config/metrics/counts_all/20210510202604_in_product_marketing_email_create_2_sent.yml
index 064e9ccf999..74a7b179acf 100644
--- a/config/metrics/counts_all/20210510202604_in_product_marketing_email_create_2_sent.yml
+++ b/config/metrics/counts_all/20210510202604_in_product_marketing_email_create_2_sent.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_create_2_sent
-name: "count_sent_third_email_of_the_create_track_for_in_product_marketing_emails"
description: Total sent emails of the create track's third email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510202724_in_product_marketing_email_create_2_cta_clicked.yml b/config/metrics/counts_all/20210510202724_in_product_marketing_email_create_2_cta_clicked.yml
index a408cf82092..221c16450fc 100644
--- a/config/metrics/counts_all/20210510202724_in_product_marketing_email_create_2_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510202724_in_product_marketing_email_create_2_cta_clicked.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_create_2_cta_clicked
-name: "count_clicks_on_the_third_email_of_the_create_track_for_in_product_marketing_emails"
description: Total clicks on the create track's third email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510202807_in_product_marketing_email_verify_0_sent.yml b/config/metrics/counts_all/20210510202807_in_product_marketing_email_verify_0_sent.yml
index df84273fe83..2ca26cca60a 100644
--- a/config/metrics/counts_all/20210510202807_in_product_marketing_email_verify_0_sent.yml
+++ b/config/metrics/counts_all/20210510202807_in_product_marketing_email_verify_0_sent.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_verify_0_sent
-name: "count_sent_first_email_of_the_verify_track_for_in_product_marketing_emails"
description: Total sent emails of the verify track's first email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510202943_in_product_marketing_email_verify_0_cta_clicked.yml b/config/metrics/counts_all/20210510202943_in_product_marketing_email_verify_0_cta_clicked.yml
index e3930f3120b..403e58a0bb9 100644
--- a/config/metrics/counts_all/20210510202943_in_product_marketing_email_verify_0_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510202943_in_product_marketing_email_verify_0_cta_clicked.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_verify_0_cta_clicked
-name: "count_clicks_on_the_first_email_of_the_verify_track_for_in_product_marketing_emails"
description: Total clicks on the verify track's first email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510202955_in_product_marketing_email_verify_1_sent.yml b/config/metrics/counts_all/20210510202955_in_product_marketing_email_verify_1_sent.yml
index c7a85350425..b1370f700a2 100644
--- a/config/metrics/counts_all/20210510202955_in_product_marketing_email_verify_1_sent.yml
+++ b/config/metrics/counts_all/20210510202955_in_product_marketing_email_verify_1_sent.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_verify_1_sent
-name: "count_sent_second_email_of_the_verify_track_for_in_product_marketing_emails"
description: Total sent emails of the verify track's second email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510203005_in_product_marketing_email_verify_1_cta_clicked.yml b/config/metrics/counts_all/20210510203005_in_product_marketing_email_verify_1_cta_clicked.yml
index 7574fc98775..eac2a9fd27f 100644
--- a/config/metrics/counts_all/20210510203005_in_product_marketing_email_verify_1_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510203005_in_product_marketing_email_verify_1_cta_clicked.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_verify_1_cta_clicked
-name: "count_clicks_on_the_second_email_of_the_verify_track_for_in_product_marketing_emails"
description: Total clicks on the verify track's second email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510203015_in_product_marketing_email_verify_2_sent.yml b/config/metrics/counts_all/20210510203015_in_product_marketing_email_verify_2_sent.yml
index c1e5b418d90..f8541ab06e7 100644
--- a/config/metrics/counts_all/20210510203015_in_product_marketing_email_verify_2_sent.yml
+++ b/config/metrics/counts_all/20210510203015_in_product_marketing_email_verify_2_sent.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_verify_2_sent
-name: "count_sent_third_email_of_the_verify_track_for_in_product_marketing_emails"
description: Total sent emails of the verify track's third email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510203025_in_product_marketing_email_verify_2_cta_clicked.yml b/config/metrics/counts_all/20210510203025_in_product_marketing_email_verify_2_cta_clicked.yml
index a292d93b12b..9344152603f 100644
--- a/config/metrics/counts_all/20210510203025_in_product_marketing_email_verify_2_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510203025_in_product_marketing_email_verify_2_cta_clicked.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_verify_2_cta_clicked
-name: "count_clicks_on_the_third_email_of_the_verify_track_for_in_product_marketing_emails"
description: Total clicks on the verify track's third email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510203035_in_product_marketing_email_trial_0_sent.yml b/config/metrics/counts_all/20210510203035_in_product_marketing_email_trial_0_sent.yml
index 8b9324d0631..f2e5aa5d861 100644
--- a/config/metrics/counts_all/20210510203035_in_product_marketing_email_trial_0_sent.yml
+++ b/config/metrics/counts_all/20210510203035_in_product_marketing_email_trial_0_sent.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_trial_0_sent
-name: "count_sent_first_email_of_the_trial_track_for_in_product_marketing_emails"
description: Total sent emails of the trial track's first email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510203044_in_product_marketing_email_trial_0_cta_clicked.yml b/config/metrics/counts_all/20210510203044_in_product_marketing_email_trial_0_cta_clicked.yml
index 2753e697b56..3330c77accf 100644
--- a/config/metrics/counts_all/20210510203044_in_product_marketing_email_trial_0_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510203044_in_product_marketing_email_trial_0_cta_clicked.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_trial_0_cta_clicked
-name: "count_clicks_on_the_first_email_of_the_trial_track_for_in_product_marketing_emails"
description: Total clicks on the verify trial's first email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510203054_in_product_marketing_email_trial_1_sent.yml b/config/metrics/counts_all/20210510203054_in_product_marketing_email_trial_1_sent.yml
index bfb2b178139..22ed95ec462 100644
--- a/config/metrics/counts_all/20210510203054_in_product_marketing_email_trial_1_sent.yml
+++ b/config/metrics/counts_all/20210510203054_in_product_marketing_email_trial_1_sent.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_trial_1_sent
-name: "count_sent_second_email_of_the_trial_track_for_in_product_marketing_emails"
description: Total sent emails of the trial track's second email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510203104_in_product_marketing_email_trial_1_cta_clicked.yml b/config/metrics/counts_all/20210510203104_in_product_marketing_email_trial_1_cta_clicked.yml
index 82cf36fa2cf..d75875d60f6 100644
--- a/config/metrics/counts_all/20210510203104_in_product_marketing_email_trial_1_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510203104_in_product_marketing_email_trial_1_cta_clicked.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_trial_1_cta_clicked
-name: "count_clicks_on_the_second_email_of_the_trial_track_for_in_product_marketing_emails"
description: Total clicks on the trial track's second email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510203114_in_product_marketing_email_trial_2_sent.yml b/config/metrics/counts_all/20210510203114_in_product_marketing_email_trial_2_sent.yml
index ab0b4acbfab..31d6c45b180 100644
--- a/config/metrics/counts_all/20210510203114_in_product_marketing_email_trial_2_sent.yml
+++ b/config/metrics/counts_all/20210510203114_in_product_marketing_email_trial_2_sent.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_trial_2_sent
-name: "count_sent_third_email_of_the_trial_track_for_in_product_marketing_emails"
description: Total sent emails of the trial track's third email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510203124_in_product_marketing_email_trial_2_cta_clicked.yml b/config/metrics/counts_all/20210510203124_in_product_marketing_email_trial_2_cta_clicked.yml
index a01f04cd37f..09269c37e88 100644
--- a/config/metrics/counts_all/20210510203124_in_product_marketing_email_trial_2_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510203124_in_product_marketing_email_trial_2_cta_clicked.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_trial_2_cta_clicked
-name: "count_clicks_on_the_third_email_of_the_trial_track_for_in_product_marketing_emails"
description: Total clicks on the trial track's third email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510203134_in_product_marketing_email_team_0_sent.yml b/config/metrics/counts_all/20210510203134_in_product_marketing_email_team_0_sent.yml
index def1d3c062d..165af6ee5a9 100644
--- a/config/metrics/counts_all/20210510203134_in_product_marketing_email_team_0_sent.yml
+++ b/config/metrics/counts_all/20210510203134_in_product_marketing_email_team_0_sent.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_team_0_sent
-name: "count_sent_first_email_of_the_trial_team_for_in_product_marketing_emails"
description: Total sent emails of the team track's first email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510203143_in_product_marketing_email_team_0_cta_clicked.yml b/config/metrics/counts_all/20210510203143_in_product_marketing_email_team_0_cta_clicked.yml
index 9821d80ab93..f40cfd85c4f 100644
--- a/config/metrics/counts_all/20210510203143_in_product_marketing_email_team_0_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510203143_in_product_marketing_email_team_0_cta_clicked.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_team_0_cta_clicked
-name: "count_clicks_on_the_first_email_of_the_team_track_for_in_product_marketing_emails"
description: Total clicks on the team track's first email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510203153_in_product_marketing_email_team_1_sent.yml b/config/metrics/counts_all/20210510203153_in_product_marketing_email_team_1_sent.yml
index 9211bd3ebb1..47ab4dcd046 100644
--- a/config/metrics/counts_all/20210510203153_in_product_marketing_email_team_1_sent.yml
+++ b/config/metrics/counts_all/20210510203153_in_product_marketing_email_team_1_sent.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_team_1_sent
-name: "count_sent_second_email_of_the_team_track_for_in_product_marketing_emails"
description: Total sent emails of the team track's second email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510203203_in_product_marketing_email_team_1_cta_clicked.yml b/config/metrics/counts_all/20210510203203_in_product_marketing_email_team_1_cta_clicked.yml
index a0571fbb3f7..03c15303678 100644
--- a/config/metrics/counts_all/20210510203203_in_product_marketing_email_team_1_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510203203_in_product_marketing_email_team_1_cta_clicked.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_team_1_cta_clicked
-name: "count_clicks_on_the_second_email_of_the_team_track_for_in_product_marketing_emails"
description: Total clicks on the team track's second email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510203213_in_product_marketing_email_team_2_sent.yml b/config/metrics/counts_all/20210510203213_in_product_marketing_email_team_2_sent.yml
index ff2430a5f49..d0a6eeb8fb8 100644
--- a/config/metrics/counts_all/20210510203213_in_product_marketing_email_team_2_sent.yml
+++ b/config/metrics/counts_all/20210510203213_in_product_marketing_email_team_2_sent.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_team_2_sent
-name: "count_sent_third_email_of_the_team_track_for_in_product_marketing_emails"
description: Total sent emails of the team track's third email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210510203223_in_product_marketing_email_team_2_cta_clicked.yml b/config/metrics/counts_all/20210510203223_in_product_marketing_email_team_2_cta_clicked.yml
index 71d7e51c31a..8bee7df8fbf 100644
--- a/config/metrics/counts_all/20210510203223_in_product_marketing_email_team_2_cta_clicked.yml
+++ b/config/metrics/counts_all/20210510203223_in_product_marketing_email_team_2_cta_clicked.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_team_2_cta_clicked
-name: "count_clicks_on_the_third_email_of_the_team_track_for_in_product_marketing_emails"
description: Total clicks on the team track's third email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210518081225_in_product_marketing_email_experience_0_sent.yml b/config/metrics/counts_all/20210518081225_in_product_marketing_email_experience_0_sent.yml
index 13c9d9ea3ff..7d3f47699fe 100644
--- a/config/metrics/counts_all/20210518081225_in_product_marketing_email_experience_0_sent.yml
+++ b/config/metrics/counts_all/20210518081225_in_product_marketing_email_experience_0_sent.yml
@@ -1,7 +1,6 @@
---
data_category: optional
key_path: counts.in_product_marketing_email_experience_0_sent
-name: "count_sent_first_email_of_the_experience_track_for_in_product_marketing_emails"
description: Total sent emails of the experience track's first email
product_section: 'TBD'
product_stage: growth
diff --git a/config/metrics/counts_all/20210709191135_package_events_i_package_nuget_pull_symbol_package.yml b/config/metrics/counts_all/20210709191135_package_events_i_package_nuget_pull_symbol_package.yml
index fcb565db67b..0f9e3fff69f 100644
--- a/config/metrics/counts_all/20210709191135_package_events_i_package_nuget_pull_symbol_package.yml
+++ b/config/metrics/counts_all/20210709191135_package_events_i_package_nuget_pull_symbol_package.yml
@@ -1,6 +1,5 @@
---
key_path: counts.package_events_i_package_nuget_pull_symbol_package
-name: nuget_symbol_packages_pulled
description: A count of NuGet symbol packages that have been downloaded from the package registry
product_section: ops
product_stage: package
diff --git a/config/metrics/counts_all/20210709191829_package_events_i_package_nuget_push_symbol_package.yml b/config/metrics/counts_all/20210709191829_package_events_i_package_nuget_push_symbol_package.yml
index e3321108c3d..bd153f5ec1d 100644
--- a/config/metrics/counts_all/20210709191829_package_events_i_package_nuget_push_symbol_package.yml
+++ b/config/metrics/counts_all/20210709191829_package_events_i_package_nuget_push_symbol_package.yml
@@ -1,6 +1,5 @@
---
key_path: counts.package_events_i_package_nuget_push_symbol_package
-name: nuget_symbol_packages_pushed
description: A count of NuGet symbol packages that have been uploaded to the package registry
product_section: ops
product_stage: package
diff --git a/config/metrics/counts_all/20210709210941_package_events_i_package_pull_symbol_package.yml b/config/metrics/counts_all/20210709210941_package_events_i_package_pull_symbol_package.yml
index dc40f24ac72..a8746b3d15e 100644
--- a/config/metrics/counts_all/20210709210941_package_events_i_package_pull_symbol_package.yml
+++ b/config/metrics/counts_all/20210709210941_package_events_i_package_pull_symbol_package.yml
@@ -1,6 +1,5 @@
---
key_path: counts.package_events_i_package_pull_symbol_package
-name: symbol_packages_pulled
description: A count of symbol packages that have been pulled from the package registry
product_section: ops
product_stage: package
diff --git a/config/metrics/counts_all/20210709211058_package_events_i_package_pull_symbol_package_by_deploy_token.yml b/config/metrics/counts_all/20210709211058_package_events_i_package_pull_symbol_package_by_deploy_token.yml
index 7d0f196e242..cea95fd1c7d 100644
--- a/config/metrics/counts_all/20210709211058_package_events_i_package_pull_symbol_package_by_deploy_token.yml
+++ b/config/metrics/counts_all/20210709211058_package_events_i_package_pull_symbol_package_by_deploy_token.yml
@@ -1,6 +1,5 @@
---
key_path: counts.package_events_i_package_pull_symbol_package_by_deploy_token
-name: symbol_packages_pulled_by_deploy_token
description: A count of symbol packages that have been pulled with a deploy token from the package registry
product_section: ops
product_stage: package
diff --git a/config/metrics/counts_all/20210709211248_package_events_i_package_pull_symbol_package_by_guest.yml b/config/metrics/counts_all/20210709211248_package_events_i_package_pull_symbol_package_by_guest.yml
index 487aae4b3c0..be38c42380b 100644
--- a/config/metrics/counts_all/20210709211248_package_events_i_package_pull_symbol_package_by_guest.yml
+++ b/config/metrics/counts_all/20210709211248_package_events_i_package_pull_symbol_package_by_guest.yml
@@ -1,6 +1,5 @@
---
key_path: counts.package_events_i_package_pull_symbol_package_by_guest
-name: symbol_packages_pulled_by_guest
description: A count of symbol packages that have been pulled with by a guest from the package registry
product_section: ops
product_stage: package
diff --git a/config/metrics/counts_all/20210709211341_package_events_i_package_pull_symbol_package_by_user.yml b/config/metrics/counts_all/20210709211341_package_events_i_package_pull_symbol_package_by_user.yml
index cf0bf021c05..13ddf002dfe 100644
--- a/config/metrics/counts_all/20210709211341_package_events_i_package_pull_symbol_package_by_user.yml
+++ b/config/metrics/counts_all/20210709211341_package_events_i_package_pull_symbol_package_by_user.yml
@@ -1,6 +1,5 @@
---
key_path: counts.package_events_i_package_pull_symbol_package_by_user
-name: symbol_packages_pulled_by_user
description: A count of symbol packages that have been pulled with by an authenticated user from the package registry
product_section: ops
product_stage: package
diff --git a/config/metrics/counts_all/20210709211439_package_events_i_package_push_symbol_package.yml b/config/metrics/counts_all/20210709211439_package_events_i_package_push_symbol_package.yml
index e993de870f8..4cc55eeda3d 100644
--- a/config/metrics/counts_all/20210709211439_package_events_i_package_push_symbol_package.yml
+++ b/config/metrics/counts_all/20210709211439_package_events_i_package_push_symbol_package.yml
@@ -1,6 +1,5 @@
---
key_path: counts.package_events_i_package_push_symbol_package
-name: symbol_packages_pushed
description: A count of symbol packages that have been pushed to the package registry
product_section: ops
product_stage: package
diff --git a/config/metrics/counts_all/20210709211636_package_events_i_package_push_symbol_package_by_deploy_token.yml b/config/metrics/counts_all/20210709211636_package_events_i_package_push_symbol_package_by_deploy_token.yml
index af44b3218d6..233734cc8cd 100644
--- a/config/metrics/counts_all/20210709211636_package_events_i_package_push_symbol_package_by_deploy_token.yml
+++ b/config/metrics/counts_all/20210709211636_package_events_i_package_push_symbol_package_by_deploy_token.yml
@@ -1,6 +1,5 @@
---
key_path: counts.package_events_i_package_push_symbol_package_by_deploy_token
-name: symbol_packages_pushed_by_deploy_token
description: A count of symbol packages that have been pushed with a deploy token to the package registry
product_section: ops
product_stage: package
diff --git a/config/metrics/counts_all/20210709211731_package_events_i_package_push_symbol_package_by_guest.yml b/config/metrics/counts_all/20210709211731_package_events_i_package_push_symbol_package_by_guest.yml
index 674d7817daf..c042ddcb126 100644
--- a/config/metrics/counts_all/20210709211731_package_events_i_package_push_symbol_package_by_guest.yml
+++ b/config/metrics/counts_all/20210709211731_package_events_i_package_push_symbol_package_by_guest.yml
@@ -1,6 +1,5 @@
---
key_path: counts.package_events_i_package_push_symbol_package_by_guest
-name: symbol_packages_pushed_by_guest
description: A count of symbol packages that have been pushed by a guest to the package registry
product_section: ops
product_stage: package
diff --git a/config/metrics/counts_all/20210709211831_package_events_i_package_push_symbol_package_by_user.yml b/config/metrics/counts_all/20210709211831_package_events_i_package_push_symbol_package_by_user.yml
index cc3887eeeff..45134188c3b 100644
--- a/config/metrics/counts_all/20210709211831_package_events_i_package_push_symbol_package_by_user.yml
+++ b/config/metrics/counts_all/20210709211831_package_events_i_package_push_symbol_package_by_user.yml
@@ -1,6 +1,5 @@
---
key_path: counts.package_events_i_package_push_symbol_package_by_user
-name: symbol_packages_pushed_by_user
description: A count of symbol packages that have been pushed by an authenticated user to the package registry
product_section: ops
product_stage: package
diff --git a/config/metrics/counts_all/20210727095918_in_product_marketing_email_team_short_0_cta_clicked.yml b/config/metrics/counts_all/20210727095918_in_product_marketing_email_team_short_0_cta_clicked.yml
index 7216ad9dc11..42eee999b46 100644
--- a/config/metrics/counts_all/20210727095918_in_product_marketing_email_team_short_0_cta_clicked.yml
+++ b/config/metrics/counts_all/20210727095918_in_product_marketing_email_team_short_0_cta_clicked.yml
@@ -1,6 +1,5 @@
---
key_path: counts.in_product_marketing_email_team_short_0_cta_clicked
-name: "count_clicks_on_the_first_email_of_the_team_short_track_for_in_product_marketing_emails"
description: Total clicks on the team_short track's first email
product_section: growth
product_stage: growth
diff --git a/config/metrics/counts_all/20210727095923_in_product_marketing_email_team_short_0_sent.yml b/config/metrics/counts_all/20210727095923_in_product_marketing_email_team_short_0_sent.yml
index bc7948d5702..5b4ce9572d4 100644
--- a/config/metrics/counts_all/20210727095923_in_product_marketing_email_team_short_0_sent.yml
+++ b/config/metrics/counts_all/20210727095923_in_product_marketing_email_team_short_0_sent.yml
@@ -1,6 +1,5 @@
---
key_path: counts.in_product_marketing_email_team_short_0_sent
-name: "count_sent_first_email_of_the_team_short_track_for_in_product_marketing_emails"
description: Total sent emails of the team_short track's first email
product_section: growth
product_stage: growth
diff --git a/config/metrics/counts_all/20210727170553_in_product_marketing_email_trial_short_0_cta_clicked.yml b/config/metrics/counts_all/20210727170553_in_product_marketing_email_trial_short_0_cta_clicked.yml
index a189aa0fce9..5949772adb7 100644
--- a/config/metrics/counts_all/20210727170553_in_product_marketing_email_trial_short_0_cta_clicked.yml
+++ b/config/metrics/counts_all/20210727170553_in_product_marketing_email_trial_short_0_cta_clicked.yml
@@ -1,6 +1,5 @@
---
key_path: counts.in_product_marketing_email_trial_short_0_cta_clicked
-name: "count_clicks_on_the_first_email_of_the_trial_short_track_for_in_product_marketing_emails"
description: Total clicks on the trial_short track's first email
product_section: growth
product_stage: growth
diff --git a/config/metrics/counts_all/20210727170558_in_product_marketing_email_trial_short_0_sent.yml b/config/metrics/counts_all/20210727170558_in_product_marketing_email_trial_short_0_sent.yml
index 0d69622c3d5..42370e5b267 100644
--- a/config/metrics/counts_all/20210727170558_in_product_marketing_email_trial_short_0_sent.yml
+++ b/config/metrics/counts_all/20210727170558_in_product_marketing_email_trial_short_0_sent.yml
@@ -1,6 +1,5 @@
---
key_path: counts.in_product_marketing_email_trial_short_0_sent
-name: "count_sent_first_email_of_the_trial_short_track_for_in_product_marketing_emails"
description: Total sent emails of the trial_short track's first email
product_section: growth
product_stage: growth
diff --git a/config/metrics/counts_all/20210729140021_in_product_marketing_email_admin_verify_0_cta_clicked.yml b/config/metrics/counts_all/20210729140021_in_product_marketing_email_admin_verify_0_cta_clicked.yml
index d4768092e6f..425b2346eff 100644
--- a/config/metrics/counts_all/20210729140021_in_product_marketing_email_admin_verify_0_cta_clicked.yml
+++ b/config/metrics/counts_all/20210729140021_in_product_marketing_email_admin_verify_0_cta_clicked.yml
@@ -1,6 +1,5 @@
---
key_path: counts.in_product_marketing_email_admin_verify_0_cta_clicked
-name: "count_clicks_on_the_first_email_of_the_admin_verify_track_for_in_product_marketing_emails"
description: Total clicks on the admin_verify track's first email
product_section: growth
product_stage: growth
diff --git a/config/metrics/counts_all/20210729140423_in_product_marketing_email_admin_verify_0_sent.yml b/config/metrics/counts_all/20210729140423_in_product_marketing_email_admin_verify_0_sent.yml
index af423588b9a..1df94f95732 100644
--- a/config/metrics/counts_all/20210729140423_in_product_marketing_email_admin_verify_0_sent.yml
+++ b/config/metrics/counts_all/20210729140423_in_product_marketing_email_admin_verify_0_sent.yml
@@ -1,6 +1,5 @@
---
key_path: counts.in_product_marketing_email_admin_verify_0_sent
-name: "count_sent_first_email_of_the_admin_verify_track_for_in_product_marketing_emails"
description: Total sent emails of the admin_verify track's first email
product_section: growth
product_stage: growth
diff --git a/config/metrics/counts_all/20210730011801_projects_zentao_active.yml b/config/metrics/counts_all/20210730011801_projects_zentao_active.yml
index cc17e370b4c..e85df2176c2 100644
--- a/config/metrics/counts_all/20210730011801_projects_zentao_active.yml
+++ b/config/metrics/counts_all/20210730011801_projects_zentao_active.yml
@@ -1,6 +1,5 @@
---
key_path: counts.projects_zentao_active
-name: count_all_projects_zentao_active
description: Count of projects with active Zentao integrations
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_all/20210730011802_groups_zentao_active.yml b/config/metrics/counts_all/20210730011802_groups_zentao_active.yml
index 02752c70d85..8dbcab96fb2 100644
--- a/config/metrics/counts_all/20210730011802_groups_zentao_active.yml
+++ b/config/metrics/counts_all/20210730011802_groups_zentao_active.yml
@@ -1,6 +1,5 @@
---
key_path: counts.groups_zentao_active
-name: count_all_groups_zentao_active
description: Count of groups with active Zentao integrations
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_all/20210730011804_instances_zentao_active.yml b/config/metrics/counts_all/20210730011804_instances_zentao_active.yml
index d5bdd07ea46..bc880d7e0cc 100644
--- a/config/metrics/counts_all/20210730011804_instances_zentao_active.yml
+++ b/config/metrics/counts_all/20210730011804_instances_zentao_active.yml
@@ -1,6 +1,5 @@
---
key_path: counts.instances_zentao_active
-name: count_all_instances_zentao_active
description: Count of instances with active Zentao integrations
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_all/20210730011805_projects_inheriting_zentao_active.yml b/config/metrics/counts_all/20210730011805_projects_inheriting_zentao_active.yml
index d84151a8ded..9b03e64c722 100644
--- a/config/metrics/counts_all/20210730011805_projects_inheriting_zentao_active.yml
+++ b/config/metrics/counts_all/20210730011805_projects_inheriting_zentao_active.yml
@@ -1,6 +1,5 @@
---
key_path: counts.projects_inheriting_zentao_active
-name: count_all_projects_inheriting_zentao_active
description: Count of projects that inherit active Zentao integrations
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_all/20210730011806_groups_inheriting_zentao_active.yml b/config/metrics/counts_all/20210730011806_groups_inheriting_zentao_active.yml
index 46f11dbec22..469f34981dc 100644
--- a/config/metrics/counts_all/20210730011806_groups_inheriting_zentao_active.yml
+++ b/config/metrics/counts_all/20210730011806_groups_inheriting_zentao_active.yml
@@ -1,6 +1,5 @@
---
key_path: counts.groups_inheriting_zentao_active
-name: count_all_groups_inheriting_zentao_active
description: Count of groups that inherit active Zentao integrations
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_all/20210910132001_user_auth_by_provider.yml b/config/metrics/counts_all/20210910132001_user_auth_by_provider.yml
index e61552038a2..21cbb828118 100644
--- a/config/metrics/counts_all/20210910132001_user_auth_by_provider.yml
+++ b/config/metrics/counts_all/20210910132001_user_auth_by_provider.yml
@@ -1,6 +1,5 @@
---
key_path: usage_activity_by_stage.manage.user_auth_by_provider
-name: count_distinct_users_using_two_factor_authentication
description: Number of unique user logins using two factor authentication for available providers
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_all/20210916100524_groups_gitlab_slack_application_active.yml b/config/metrics/counts_all/20210916100524_groups_gitlab_slack_application_active.yml
index e374f970901..aa9fe865b5f 100644
--- a/config/metrics/counts_all/20210916100524_groups_gitlab_slack_application_active.yml
+++ b/config/metrics/counts_all/20210916100524_groups_gitlab_slack_application_active.yml
@@ -1,6 +1,5 @@
---
key_path: counts.groups_gitlab_slack_application_active
-name: count_groups_gitlab_slack_application_active
description: Count groups with active slack application
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_all/20210916101641_projects_gitlab_slack_application_active.yml b/config/metrics/counts_all/20210916101641_projects_gitlab_slack_application_active.yml
index f8ad5d4c793..dc0b0b61fc1 100644
--- a/config/metrics/counts_all/20210916101641_projects_gitlab_slack_application_active.yml
+++ b/config/metrics/counts_all/20210916101641_projects_gitlab_slack_application_active.yml
@@ -1,6 +1,5 @@
---
key_path: counts.projects_gitlab_slack_application_active
-name: count_project_gitlab_slack_application_active
description: Count projects with active slack application
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_all/20210916101837_instances_gitlab_slack_application_active.yml b/config/metrics/counts_all/20210916101837_instances_gitlab_slack_application_active.yml
index 16043ec6137..fba5a96dcf1 100644
--- a/config/metrics/counts_all/20210916101837_instances_gitlab_slack_application_active.yml
+++ b/config/metrics/counts_all/20210916101837_instances_gitlab_slack_application_active.yml
@@ -1,6 +1,5 @@
---
key_path: counts.instances_gitlab_slack_application_active
-name: count_instances_gitlab_slack_application_active
description: Count instances with active slack application
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_all/20210917040700_groups_inheriting_gitlab_slack_application_active.yml b/config/metrics/counts_all/20210917040700_groups_inheriting_gitlab_slack_application_active.yml
index 48aa9b15864..a5ff234a1d7 100644
--- a/config/metrics/counts_all/20210917040700_groups_inheriting_gitlab_slack_application_active.yml
+++ b/config/metrics/counts_all/20210917040700_groups_inheriting_gitlab_slack_application_active.yml
@@ -1,6 +1,5 @@
---
key_path: counts.groups_inheriting_gitlab_slack_application_active
-name: count_groups_inheriting_gitlab_slack_application_active
description: Count groups inheriting active slack application
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_all/20210917040956_projects_inheriting_gitlab_slack_application_active.yml b/config/metrics/counts_all/20210917040956_projects_inheriting_gitlab_slack_application_active.yml
index 8b95c0df21a..96da8a57bd4 100644
--- a/config/metrics/counts_all/20210917040956_projects_inheriting_gitlab_slack_application_active.yml
+++ b/config/metrics/counts_all/20210917040956_projects_inheriting_gitlab_slack_application_active.yml
@@ -1,6 +1,5 @@
---
key_path: counts.projects_inheriting_gitlab_slack_application_active
-name: count_project_inheriting_gitlab_slack_application_active
description: Count projects inheriting active slack application
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_all/20211028210001_projects_shimo_active.yml b/config/metrics/counts_all/20211028210001_projects_shimo_active.yml
index b641f342f1e..1deb27f14b1 100644
--- a/config/metrics/counts_all/20211028210001_projects_shimo_active.yml
+++ b/config/metrics/counts_all/20211028210001_projects_shimo_active.yml
@@ -1,6 +1,5 @@
---
key_path: counts.projects_shimo_active
-name: count_all_projects_shimo_active
description: Count of projects with active Shimo integrations
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_all/20211028210002_groups_shimo_active.yml b/config/metrics/counts_all/20211028210002_groups_shimo_active.yml
index 6f97ff718f6..efac7bb2ed7 100644
--- a/config/metrics/counts_all/20211028210002_groups_shimo_active.yml
+++ b/config/metrics/counts_all/20211028210002_groups_shimo_active.yml
@@ -1,6 +1,5 @@
---
key_path: counts.groups_shimo_active
-name: count_all_groups_shimo_active
description: Count of groups with active Shimo integrations
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_all/20211028210003_instances_shimo_active.yml b/config/metrics/counts_all/20211028210003_instances_shimo_active.yml
index 6a976b62517..ad5e6b7beb2 100644
--- a/config/metrics/counts_all/20211028210003_instances_shimo_active.yml
+++ b/config/metrics/counts_all/20211028210003_instances_shimo_active.yml
@@ -1,6 +1,5 @@
---
key_path: counts.instances_shimo_active
-name: count_all_instances_shimo_active
description: Count of instances with active Shimo integrations
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_all/20211028210004_projects_inheriting_shimo_active.yml b/config/metrics/counts_all/20211028210004_projects_inheriting_shimo_active.yml
index 039afc60009..a2fc5f528fb 100644
--- a/config/metrics/counts_all/20211028210004_projects_inheriting_shimo_active.yml
+++ b/config/metrics/counts_all/20211028210004_projects_inheriting_shimo_active.yml
@@ -1,6 +1,5 @@
---
key_path: counts.projects_inheriting_shimo_active
-name: count_all_projects_inheriting_shimo_active
description: Count of projects that inherit active Shimo integrations
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_all/20211028210005_groups_inheriting_shimo_active.yml b/config/metrics/counts_all/20211028210005_groups_inheriting_shimo_active.yml
index 093d22825a9..5be37a39f47 100644
--- a/config/metrics/counts_all/20211028210005_groups_inheriting_shimo_active.yml
+++ b/config/metrics/counts_all/20211028210005_groups_inheriting_shimo_active.yml
@@ -1,6 +1,5 @@
---
key_path: counts.groups_inheriting_shimo_active
-name: count_all_groups_inheriting_shimo_active
description: Count of groups that inherit active Shimo integrations
product_section: dev
product_stage: manage
diff --git a/config/metrics/counts_all/20220314362302_service_usage_data_download_payload.yml b/config/metrics/counts_all/20220314362302_service_usage_data_download_payload.yml
index 1a562bc23d8..f6e6a048038 100644
--- a/config/metrics/counts_all/20220314362302_service_usage_data_download_payload.yml
+++ b/config/metrics/counts_all/20220314362302_service_usage_data_download_payload.yml
@@ -2,7 +2,6 @@
key_path: counts.service_usage_data_download_payload_click
description: Count Download Payload button clicks
data_category: optional
-name: service_usage_data_download_payload_click
product_section: analytics
product_stage: analytics
product_group: analytics_instrumentation
diff --git a/config/metrics/counts_all/20230306191328_i_container_registry_delete_manifest.yml b/config/metrics/counts_all/20230306191328_i_container_registry_delete_manifest.yml
index 0cb1ceb8595..2980ffbeb6d 100644
--- a/config/metrics/counts_all/20230306191328_i_container_registry_delete_manifest.yml
+++ b/config/metrics/counts_all/20230306191328_i_container_registry_delete_manifest.yml
@@ -1,6 +1,5 @@
---
key_path: counts.container_registry_events_i_container_registry_delete_manifest
-name: manifest_delete_events
description: A count of manifests that have been deleted
product_section: ops
product_stage: package
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 86bfd2d3f13..ae0dd7ae2c1 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -20787,6 +20787,17 @@ Represents vulnerability finding of a security report on the pipeline.
| <a id="pipelinetriggerowner"></a>`owner` | [`UserCore!`](#usercore) | Owner of the pipeline trigger token. |
| <a id="pipelinetriggertoken"></a>`token` | [`String!`](#string) | Value of the pipeline trigger token. |
+### `PolicyApprovalGroup`
+
+#### Fields
+
+| Name | Type | Description |
+| ---- | ---- | ----------- |
+| <a id="policyapprovalgroupavatarurl"></a>`avatarUrl` | [`String`](#string) | Avatar URL of the group. |
+| <a id="policyapprovalgroupfullpath"></a>`fullPath` | [`ID!`](#id) | Full path of the namespace. |
+| <a id="policyapprovalgroupid"></a>`id` | [`ID!`](#id) | ID of the namespace. |
+| <a id="policyapprovalgroupweburl"></a>`webUrl` | [`String!`](#string) | Web URL of the group. |
+
### `PreviewBillableUserChange`
#### Fields
@@ -23266,6 +23277,7 @@ Represents the scan result policy.
| Name | Type | Description |
| ---- | ---- | ----------- |
+| <a id="scanresultpolicyallgroupapprovers"></a>`allGroupApprovers` | [`[PolicyApprovalGroup!]`](#policyapprovalgroup) | All potential approvers of the group type, including groups inaccessible to the user. |
| <a id="scanresultpolicydescription"></a>`description` | [`String!`](#string) | Description of the policy. |
| <a id="scanresultpolicyenabled"></a>`enabled` | [`Boolean!`](#boolean) | Indicates whether this policy is enabled. |
| <a id="scanresultpolicygroupapprovers"></a>`groupApprovers` | [`[Group!]`](#group) | Approvers of the group type. |
diff --git a/doc/ci/docker/using_kaniko.md b/doc/ci/docker/using_kaniko.md
index b7affe28984..b3dc446a1dd 100644
--- a/doc/ci/docker/using_kaniko.md
+++ b/doc/ci/docker/using_kaniko.md
@@ -73,9 +73,11 @@ If you authenticate against the [Dependency Proxy](../../user/packages/dependenc
you must add the corresponding CI/CD variables for authentication to the `config.json` file:
```yaml
-- echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"},\"$CI_DEPENDENCY_PROXY_SERVER\":{\"auth\":\"$(printf "%s:%s" ${CI_DEPENDENCY_PROXY_USER} "${CI_DEPENDENCY_PROXY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
+- echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"},\"$(echo -n $CI_DEPENDENCY_PROXY_SERVER | awk -F[:] '{print $1}')\":{\"auth\":\"$(printf "%s:%s" ${CI_DEPENDENCY_PROXY_USER} "${CI_DEPENDENCY_PROXY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
```
+This command strips the port, for example `:443`, from `CI_DEPENDENCY_PROXY_SERVER`, so you don't have to include it when referencing images.
+
### Building an image with kaniko behind a proxy
If you use a custom GitLab Runner behind an http(s) proxy, kaniko needs to be set
diff --git a/doc/development/contributing/index.md b/doc/development/contributing/index.md
index b929a5c0f04..d2063a6836d 100644
--- a/doc/development/contributing/index.md
+++ b/doc/development/contributing/index.md
@@ -54,7 +54,7 @@ To write and test your code, you will use the GitLab Development Kit.
- To run the development environment locally, download and set up the
[GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit).
See the [GDK README](https://gitlab.com/gitlab-org/gitlab-development-kit/blob/main/README.md) for setup instructions
- and [Troubleshooting](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/troubleshooting.md) if you get stuck.
+ and [Troubleshooting](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/troubleshooting/index.md) if you get stuck.
- GDK is heavy. If you need to build something fast, by trial and error,
consider doing so with an empty rails app and port it to GDK after.
diff --git a/doc/development/fe_guide/index.md b/doc/development/fe_guide/index.md
index 6bebc585965..405e830406e 100644
--- a/doc/development/fe_guide/index.md
+++ b/doc/development/fe_guide/index.md
@@ -31,6 +31,8 @@ We use [Apollo](https://www.apollographql.com/) as our global state manager and
You should **not** [use VueX and Apollo together](graphql.md#using-with-vuex),
and should [avoid adding new VueX stores](migrating_from_vuex.md) whenever possible.
+For copy strings and translations, we have frontend utilities available. Please see the JavaScript section of [Preparing a page for translation](../i18n/externalization.md#javascript-files) for more information.
+
Working with our frontend assets requires Node (v12.22.1 or greater) and Yarn
(v1.10.0 or greater). You can find information on how to install these on our
[installation guide](../../install/installation.md#5-node).
diff --git a/doc/development/i18n/externalization.md b/doc/development/i18n/externalization.md
index 12ef454d234..60f18032460 100644
--- a/doc/development/i18n/externalization.md
+++ b/doc/development/i18n/externalization.md
@@ -228,58 +228,29 @@ If strings are reused throughout a component, it can be useful to define these s
</template>
```
-Also consider defining these strings in a `constants.js` file, especially if they need
-to be shared across different modules.
+If we are reusing the same translated string in multiple components, it is tempting to add them to a `constants.js` file instead and import them across our components. However, there are multiple pitfalls to this approach:
-```javascript
- javascripts
- │
- └───alert_settings
- │ │ constants.js
- │ └───components
- │ │ alert_settings_form.vue
-
-
- // constants.js
-
- import { s__ } from '~/locale';
-
- /* Integration constants */
+- It creates distance between the HTML template and the copy, adding an additional level of complexity while navigating our codebase.
+- Copy strings are rarely, if ever, truly the same entity. The benefit of having a reusable variable is to have one easy place to go to update a value, but for copy it is quite common to have similar strings that aren't quite the same.
- export const MSG_ALERT_SETTINGS_FORM_ERROR = __('Failed to save alert settings.')
+Another practice to avoid when exporting copy strings is to import them in specs. While it might seem like a much more efficient test (if we change the copy, the test will still pass!) it creates additional problems:
+- There is a risk that the value we import is `undefined` and we might get a false-positive in our tests (even more so if we import an `i18n` object, see [export constants as primitives](../fe_guide/style/javascript.md#export-constants-as-primitives)).
+- It is harder to know what we are testing (which copy to expect).
+- There is a higher risk of typos being missed because we are not re-writing the assertion, but assuming that the value of our constant is the correct one.
+- The benefit of this approach is minor. Updating the copy in our component and not updating specs is not a big enough benefit to outweigh the potential issues.
- // alert_settings_form.vue
-
- import {
- MSG_ALERT_SETTINGS_FORM_ERROR,
- } from '../constants';
-
- <script>
- export default {
- MSG_ALERT_SETTINGS_FROM_ERROR,
- }
- </script>
-
- <template>
- <gl-alert v-if="showAlert">
- {{ $options.MSG_ALERT_SETTINGS_FORM_ERROR }}
- </gl-alert>
- </template>
-```
-
-Using either `constants` or `$options.i18n` allows us to reference messages directly in specs:
+As an example:
```javascript
import { MSG_ALERT_SETTINGS_FORM_ERROR } from 'path/to/constants.js';
-// okay
-expect(wrapper.text()).toEqual('this test will fail just from button text changing!');
-
-// better
-expect(wrapper.text()).toEqual(MyComponent.i18n.buttonLabel);
-// also better
-expect(wrapper.text()).toEqual(MSG_ALERT_SETTINGS_FORM_ERROR);
+// Bad. What is the actual text for `MSG_ALERT_SETTINGS_FORM_ERROR`? If `wrapper.text()` returns undefined, the test may still pass with the wrong values!
+expect(wrapper.text()).toBe(MSG_ALERT_SETTINGS_FORM_ERROR);
+// Very bad. Same problem as above and we are going through the vm property!
+expect(wrapper.text()).toBe(MyComponent.vm.i18n.buttonLabel);
+// Good. What we are expecting is very clear and there can be no surprises.
+expect(wrapper.text()).toBe('There was an error: Please refresh and hope for the best!');
```
### Dynamic translations
diff --git a/doc/development/migration_style_guide.md b/doc/development/migration_style_guide.md
index 723eade6884..65dc4de30d1 100644
--- a/doc/development/migration_style_guide.md
+++ b/doc/development/migration_style_guide.md
@@ -420,6 +420,18 @@ minimum acceptable timestamp would be 20230424000000.
While the above should be considered a hard rule, it is a best practice to try to keep migration timestamps to within three weeks of the date it is anticipated that the migration will be merged upstream, regardless of how much time has elapsed since the last hard stop.
+To update a migration timestamp:
+
+1. Migrate down the migration for the `ci` and `main` DBs:
+
+ ```ruby
+ rake db:migrate:down:main VERSION=<timestamp>
+ rake db:migrate:down:ci VERSION=<timestamp>
+ ```
+
+1. Delete the migration file.
+1. Recreate the migration following the [migration style guide](#choose-an-appropriate-migration-type).
+
## Migration helpers and versioning
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/339115) in GitLab 14.3.
diff --git a/doc/update/index.md b/doc/update/index.md
index dcb9db0e49f..20389cc41b3 100644
--- a/doc/update/index.md
+++ b/doc/update/index.md
@@ -319,12 +319,22 @@ Before upgrading, see [GitLab 16 changes](versions/gitlab_16_changes.md).
### 15.10.5
+- A [bug with Elastic Indexer Cron Workers](https://gitlab.com/gitlab-org/gitlab/-/issues/408214) can cause saturation in Sidekiq.
+ - When this issue occurs, merge request merges, pipelines, Slack notifications, and other events are not created or take a long time to occur.
+ - This issue may not manifest immediately as it can take up to a week before the Sidekiq is saturated enough.
+ - Elasticsearch does not need to be enabled for this to occur.
+ - To resolve this issue, upgrade to 15.11 or use the workaround in the issue.
- Many [project importers](../user/project/import/index.md) and [group importers](../user/group/import/index.md) now
require the Maintainer role instead of only requiring the Developer role. For more information, see the documentation
for any importers you use.
### 15.10.0
+- A [bug with Elastic Indexer Cron Workers](https://gitlab.com/gitlab-org/gitlab/-/issues/408214) can cause saturation in Sidekiq.
+ - When this issue occurs, merge request merges, pipelines, Slack notifications, and other events are not created or take a long time to occur.
+ - This issue may not manifest immediately as it can take up to a week before the Sidekiq is saturated enough.
+ - Elasticsearch does not need to be enabled for this to occur.
+ - To resolve this issue, upgrade to 15.11 or use the workaround in the issue.
- Gitaly configuration changes significantly in Omnibus GitLab 16.0. You can begin migrating to the new structure in Omnibus GitLab 15.10 while backwards compatibility is
maintained in the lead up to Omnibus GitLab 16.0. [Read more about this change](#gitaly-omnibus-gitlab-configuration-structure-change).
- You might encounter the following error while upgrading to GitLab 15.10 or later:
@@ -375,6 +385,11 @@ For more information, see [issue 415724](https://gitlab.com/gitlab-org/gitlab/-/
### 15.9.0
+- A [bug with Elastic Indexer Cron Workers](https://gitlab.com/gitlab-org/gitlab/-/issues/408214) can cause saturation in Sidekiq.
+ - When this issue occurs, merge request merges, pipelines, Slack notifications, and other events are not created or take a long time to occur.
+ - This issue may not manifest immediately as it can take up to a week before the Sidekiq is saturated enough.
+ - Elasticsearch does not need to be enabled for this to occur.
+ - To resolve this issue, upgrade to 15.11 or use the workaround in the issue.
- **Upgrade to patch release 15.9.3 or later**. This provides fixes for two database migration bugs:
- Patch releases 15.9.0, 15.9.1, 15.9.2 have [a bug that can cause data loss](#user-profile-data-loss-bug-in-159x) from the user profile fields.
- The second [bug fix](https://gitlab.com/gitlab-org/gitlab/-/issues/394760) ensures it is possible to upgrade directly from 15.4.x.
diff --git a/doc/user/group/manage.md b/doc/user/group/manage.md
index c5a332d4ce0..308f5d20502 100644
--- a/doc/user/group/manage.md
+++ b/doc/user/group/manage.md
@@ -493,6 +493,9 @@ To disable third-party AI features for a group:
1. Under **Third-party AI services**, uncheck the **Use third-party AI services** checkbox.
1. Select **Save changes**.
+When Code Suggestions are enabled and disabled, an
+[audit event](../../administration/audit_events.md#view-audit-events) is created.
+
## Group activity analytics **(PREMIUM)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/207164) in GitLab 12.10 as a [Beta feature](../../policy/experiment-beta-support.md#beta).
diff --git a/lib/api/metrics/user_starred_dashboards.rb b/lib/api/metrics/user_starred_dashboards.rb
index b7fba2b6459..eeb1efb9001 100644
--- a/lib/api/metrics/user_starred_dashboards.rb
+++ b/lib/api/metrics/user_starred_dashboards.rb
@@ -25,15 +25,7 @@ module API
end
post ':id/metrics/user_starred_dashboards' do
- not_found! if Feature.enabled?(:remove_monitor_metrics)
-
- result = ::Metrics::UsersStarredDashboards::CreateService.new(current_user, user_project, params[:dashboard_path]).execute
-
- if result.success?
- present result.payload, with: Entities::Metrics::UserStarredDashboard
- else
- error!({ errors: result.message }, 400)
- end
+ not_found!
end
desc 'Remove a star from a dashboard' do
@@ -52,16 +44,7 @@ module API
end
delete ':id/metrics/user_starred_dashboards' do
- not_found! if Feature.enabled?(:remove_monitor_metrics)
-
- result = ::Metrics::UsersStarredDashboards::DeleteService.new(current_user, user_project, params[:dashboard_path]).execute
-
- if result.success?
- status :ok
- result.payload
- else
- status :bad_request
- end
+ not_found!
end
end
end
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb
index 11edf4f30fe..3a0f38bb171 100644
--- a/lib/gitlab/git/repository.rb
+++ b/lib/gitlab/git/repository.rb
@@ -1198,6 +1198,12 @@ module Gitlab
end
end
+ def get_patch_id(old_revision, new_revision)
+ wrapped_gitaly_errors do
+ gitaly_commit_client.get_patch_id(old_revision, new_revision)
+ end
+ end
+
private
def repository_info_size_megabytes
diff --git a/lib/gitlab/gitaly_client/commit_service.rb b/lib/gitlab/gitaly_client/commit_service.rb
index 0b0cf19752f..1ef5b0f96c2 100644
--- a/lib/gitlab/gitaly_client/commit_service.rb
+++ b/lib/gitlab/gitaly_client/commit_service.rb
@@ -589,6 +589,15 @@ module Gitlab
Hash[commit_refs]
end
+ def get_patch_id(old_revision, new_revision)
+ request = Gitaly::GetPatchIDRequest
+ .new(repository: @gitaly_repo, old_revision: old_revision, new_revision: new_revision)
+
+ response = gitaly_client_call(@repository.storage, :diff_service, :get_patch_id, request, timeout: GitalyClient.medium_timeout)
+
+ response.patch_id
+ end
+
private
def parse_global_options!(options)
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 55ac7a8e421..f6606bcd427 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -29669,12 +29669,6 @@ msgstr ""
msgid "MetricsDashboardAnnotation|can't be before starting_at time"
msgstr ""
-msgid "MetricsUsersStarredDashboards|Dashboard with requested path can not be found"
-msgstr ""
-
-msgid "MetricsUsersStarredDashboards|You are not authorized to add star to this dashboard"
-msgstr ""
-
msgid "Metrics|Create metric"
msgstr ""
@@ -41365,6 +41359,9 @@ msgstr ""
msgid "ScanResultPolicy|Age is:"
msgstr ""
+msgid "ScanResultPolicy|Block users from unprotecting branches"
+msgstr ""
+
msgid "ScanResultPolicy|Choose an option"
msgstr ""
@@ -41410,6 +41407,9 @@ msgstr ""
msgid "ScanResultPolicy|Only 2 status criteria are allowed"
msgstr ""
+msgid "ScanResultPolicy|Override project approval settings"
+msgstr ""
+
msgid "ScanResultPolicy|Pre-existing"
msgstr ""
diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb
index 6eb80df3877..932353f0bd5 100644
--- a/spec/db/schema_spec.rb
+++ b/spec/db/schema_spec.rb
@@ -44,7 +44,7 @@ RSpec.describe 'Database schema', feature_category: :database do
broadcast_messages: %w[namespace_id],
chat_names: %w[chat_id team_id user_id integration_id],
chat_teams: %w[team_id],
- ci_builds: %w[erased_by_id trigger_request_id partition_id],
+ ci_builds: %w[project_id runner_id user_id erased_by_id trigger_request_id partition_id],
ci_namespace_monthly_usages: %w[namespace_id],
ci_pipeline_variables: %w[partition_id],
ci_pipelines: %w[partition_id],
@@ -87,7 +87,7 @@ RSpec.describe 'Database schema', feature_category: :database do
oauth_access_grants: %w[resource_owner_id application_id],
oauth_access_tokens: %w[resource_owner_id application_id],
oauth_applications: %w[owner_id],
- p_ci_builds: %w[project_id runner_id user_id erased_by_id trigger_request_id partition_id],
+ p_ci_builds: %w[erased_by_id trigger_request_id partition_id],
p_batched_git_ref_updates_deletions: %w[project_id partition_id],
product_analytics_events_experimental: %w[event_id txn_id user_id],
project_build_artifacts_size_refreshes: %w[last_job_artifact_id],
@@ -195,18 +195,23 @@ RSpec.describe 'Database schema', feature_category: :database do
IGNORED_LIMIT_ENUMS = {
'Analytics::CycleAnalytics::Stage' => %w[start_event_identifier end_event_identifier],
'Ci::Bridge' => %w[failure_reason],
+ 'Ci::Bridge::Partitioned' => %w[failure_reason],
'Ci::Build' => %w[failure_reason],
+ 'Ci::Build::Partitioned' => %w[failure_reason],
'Ci::BuildMetadata' => %w[timeout_source],
'Ci::BuildTraceChunk' => %w[data_store],
'Ci::DailyReportResult' => %w[param_type],
'Ci::JobArtifact' => %w[file_type],
'Ci::Pipeline' => %w[source config_source failure_reason],
'Ci::Processable' => %w[failure_reason],
+ 'Ci::Processable::Partitioned' => %w[failure_reason],
'Ci::Runner' => %w[access_level],
'Ci::Stage' => %w[status],
'Clusters::Cluster' => %w[platform_type provider_type],
'CommitStatus' => %w[failure_reason],
+ 'CommitStatus::Partitioned' => %w[failure_reason],
'GenericCommitStatus' => %w[failure_reason],
+ 'GenericCommitStatus::Partitioned' => %w[failure_reason],
'InternalId' => %w[usage],
'List' => %w[list_type],
'NotificationSetting' => %w[level],
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap b/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap
index 7a488a74dcb..e0e6c101029 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/__snapshots__/package_list_row_spec.js.snap
@@ -104,35 +104,33 @@ exports[`packages_list_row renders 1`] = `
<div
class="gl-w-9 gl-display-flex gl-justify-content-end gl-pr-1"
>
- <gl-dropdown-stub
+ <gl-disclosure-dropdown-stub
+ autoclose="true"
category="tertiary"
- clearalltext="Clear all"
- clearalltextclass="gl-px-5"
data-testid="delete-dropdown"
- headertext=""
- hideheaderborder="true"
- highlighteditemstitle="Selected"
- highlighteditemstitleclass="gl-px-5"
icon="ellipsis_v"
- no-caret=""
+ items=""
+ nocaret="true"
+ placement="left"
+ positioningstrategy="absolute"
size="medium"
- text="More actions"
textsronly="true"
+ toggleid="dropdown-toggle-btn-3"
+ toggletext="More actions"
variant="default"
>
- <gl-dropdown-item-stub
- avatarurl=""
+ <gl-disclosure-dropdown-item-stub
data-testid="action-delete"
- iconcolor=""
- iconname=""
- iconrightarialabel=""
- iconrightname=""
- secondarytext=""
- variant="danger"
>
- Delete package
- </gl-dropdown-item-stub>
- </gl-dropdown-stub>
+ <span
+ class="gl-text-red-500"
+ >
+
+ Delete package
+
+ </span>
+ </gl-disclosure-dropdown-item-stub>
+ </gl-disclosure-dropdown-stub>
</div>
</div>
diff --git a/spec/frontend/packages_and_registries/package_registry/components/list/package_list_row_spec.js b/spec/frontend/packages_and_registries/package_registry/components/list/package_list_row_spec.js
index 523d5f855fc..9f8fd4e28e7 100644
--- a/spec/frontend/packages_and_registries/package_registry/components/list/package_list_row_spec.js
+++ b/spec/frontend/packages_and_registries/package_registry/components/list/package_list_row_spec.js
@@ -34,7 +34,8 @@ describe('packages_list_row', () => {
const packageWithTags = { ...packageWithoutTags, tags: { nodes: packageTags() } };
const findPackageTags = () => wrapper.findComponent(PackageTags);
- const findDeleteDropdown = () => wrapper.findByTestId('action-delete');
+ const findDeleteDropdown = () => wrapper.findByTestId('delete-dropdown');
+ const findDeleteButton = () => wrapper.findByTestId('action-delete');
const findPackageType = () => wrapper.findByTestId('package-type');
const findPackageLink = () => wrapper.findByTestId('details-link');
const findWarningIcon = () => wrapper.findByTestId('warning-icon');
@@ -103,7 +104,7 @@ describe('packages_list_row', () => {
});
});
- describe('delete button', () => {
+ describe('delete dropdown', () => {
it('does not exist when package cannot be destroyed', () => {
mountComponent({
packageEntity: { ...packageWithoutTags, canDestroy: false },
@@ -112,19 +113,39 @@ describe('packages_list_row', () => {
expect(findDeleteDropdown().exists()).toBe(false);
});
- it('exists and has the correct props', () => {
- mountComponent({ packageEntity: packageWithoutTags });
+ it('exists when package can be destroyed', () => {
+ mountComponent();
- expect(findDeleteDropdown().exists()).toBe(true);
- expect(findDeleteDropdown().attributes()).toMatchObject({
- variant: 'danger',
+ expect(findDeleteDropdown().props()).toMatchObject({
+ category: 'tertiary',
+ icon: 'ellipsis_v',
+ textSrOnly: true,
+ noCaret: true,
+ toggleText: 'More actions',
});
});
+ });
+
+ describe('delete button', () => {
+ it('does not exist when package cannot be destroyed', () => {
+ mountComponent({
+ packageEntity: { ...packageWithoutTags, canDestroy: false },
+ });
+
+ expect(findDeleteButton().exists()).toBe(false);
+ });
+
+ it('exists and has the correct text', () => {
+ mountComponent({ packageEntity: packageWithoutTags });
+
+ expect(findDeleteButton().exists()).toBe(true);
+ expect(findDeleteButton().text()).toBe('Delete package');
+ });
it('emits the delete event when the delete button is clicked', () => {
mountComponent({ packageEntity: packageWithoutTags });
- findDeleteDropdown().vm.$emit('click');
+ findDeleteButton().vm.$emit('action');
expect(wrapper.emitted('delete')).toHaveLength(1);
});
diff --git a/spec/frontend/work_items/components/work_item_created_updated_spec.js b/spec/frontend/work_items/components/work_item_created_updated_spec.js
index 428b33aecfa..f77c5481906 100644
--- a/spec/frontend/work_items/components/work_item_created_updated_spec.js
+++ b/spec/frontend/work_items/components/work_item_created_updated_spec.js
@@ -1,10 +1,11 @@
-import { GlAvatarLink, GlSprintf } from '@gitlab/ui';
+import { GlAvatarLink, GlSprintf, GlLoadingIcon } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import Vue from 'vue';
import VueApollo from 'vue-apollo';
import createMockApollo from 'helpers/mock_apollo_helper';
import waitForPromises from 'helpers/wait_for_promises';
import WorkItemCreatedUpdated from '~/work_items/components/work_item_created_updated.vue';
+import ConfidentialityBadge from '~/vue_shared/components/confidentiality_badge.vue';
import WorkItemTypeIcon from '~/work_items/components/work_item_type_icon.vue';
import workItemByIidQuery from '~/work_items/graphql/work_item_by_iid.query.graphql';
import { workItemByIidResponseFactory, mockAssignees } from '../mock_data';
@@ -20,11 +21,20 @@ describe('WorkItemCreatedUpdated component', () => {
const findCreatedAtText = () => findCreatedAt().text().replace(/\s+/g, ' ');
const findWorkItemTypeIcon = () => wrapper.findComponent(WorkItemTypeIcon);
-
- const createComponent = async ({ workItemIid = '1', author = null, updatedAt } = {}) => {
+ const findConfidentialityBadge = () => wrapper.findComponent(ConfidentialityBadge);
+ const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
+
+ const createComponent = async ({
+ workItemIid = '1',
+ author = null,
+ updatedAt,
+ confidential = false,
+ updateInProgress = false,
+ } = {}) => {
const workItemQueryResponse = workItemByIidResponseFactory({
author,
updatedAt,
+ confidential,
});
successHandler = jest.fn().mockResolvedValue(workItemQueryResponse);
@@ -34,7 +44,7 @@ describe('WorkItemCreatedUpdated component', () => {
provide: {
fullPath: '/some/project',
},
- propsData: { workItemIid },
+ propsData: { workItemIid, updateInProgress },
stubs: {
GlAvatarLink,
GlSprintf,
@@ -88,4 +98,24 @@ describe('WorkItemCreatedUpdated component', () => {
expect(findUpdatedAt().exists()).toBe(false);
});
+
+ describe('confidential badge', () => {
+ it('renders badge when the work item is confidential', async () => {
+ await createComponent({ confidential: true });
+
+ expect(findConfidentialityBadge().exists()).toBe(true);
+ });
+
+ it('does not render badge when the work item is confidential', async () => {
+ await createComponent({ confidential: false });
+
+ expect(findConfidentialityBadge().exists()).toBe(false);
+ });
+
+ it('shows loading icon badge when the work item is confidential', async () => {
+ await createComponent({ updateInProgress: true });
+
+ expect(findLoadingIcon().exists()).toBe(true);
+ });
+ });
});
diff --git a/spec/frontend/work_items/components/work_item_detail_spec.js b/spec/frontend/work_items/components/work_item_detail_spec.js
index 07cbd975878..d3c7c9e2074 100644
--- a/spec/frontend/work_items/components/work_item_detail_spec.js
+++ b/spec/frontend/work_items/components/work_item_detail_spec.js
@@ -1,7 +1,5 @@
import {
GlAlert,
- GlBadge,
- GlLoadingIcon,
GlSkeletonLoader,
GlButton,
GlEmptyState,
@@ -68,7 +66,6 @@ describe('WorkItemDetail component', () => {
const findAlert = () => wrapper.findComponent(GlAlert);
const findEmptyState = () => wrapper.findComponent(GlEmptyState);
const findSkeleton = () => wrapper.findComponent(GlSkeletonLoader);
- const findLoadingIcon = () => wrapper.findComponent(GlLoadingIcon);
const findWorkItemActions = () => wrapper.findComponent(WorkItemActions);
const findWorkItemTitle = () => wrapper.findComponent(WorkItemTitle);
const findCreatedUpdated = () => wrapper.findComponent(WorkItemCreatedUpdated);
@@ -316,27 +313,7 @@ describe('WorkItemDetail component', () => {
`(
'when work item has $context',
({ handlerMock, confidentialityMock, confidentialityFailureMock, inputVariables }) => {
- it('renders confidential badge when work item is confidential', async () => {
- createComponent({
- handler: jest.fn().mockResolvedValue(confidentialWorkItem),
- confidentialityMock,
- });
-
- await waitForPromises();
-
- const confidentialBadge = wrapper.findComponent(GlBadge);
- expect(confidentialBadge.exists()).toBe(true);
- expect(confidentialBadge.props()).toMatchObject({
- variant: 'warning',
- icon: 'eye-slash',
- });
- expect(confidentialBadge.attributes('title')).toBe(
- 'Only project members with at least the Reporter role, the author, and assignees can view or be notified about this task.',
- );
- expect(confidentialBadge.text()).toBe('Confidential');
- });
-
- it('renders gl-loading-icon while update mutation is in progress', async () => {
+ it('sends updateInProgress props to child component', async () => {
createComponent({
handler: handlerMock,
confidentialityMock,
@@ -348,10 +325,10 @@ describe('WorkItemDetail component', () => {
await nextTick();
- expect(findLoadingIcon().exists()).toBe(true);
+ expect(findCreatedUpdated().props('updateInProgress')).toBe(true);
});
- it('emits workItemUpdated and shows confidentiality badge when mutation is successful', async () => {
+ it('emits workItemUpdated when mutation is successful', async () => {
createComponent({
handler: handlerMock,
confidentialityMock,
@@ -366,7 +343,6 @@ describe('WorkItemDetail component', () => {
expect(confidentialityMock[1]).toHaveBeenCalledWith({
input: inputVariables,
});
- expect(findLoadingIcon().exists()).toBe(false);
});
it('shows an alert when mutation fails', async () => {
@@ -384,7 +360,6 @@ describe('WorkItemDetail component', () => {
expect(findAlert().exists()).toBe(true);
expect(findAlert().text()).toBe(errorMessage);
- expect(findLoadingIcon().exists()).toBe(false);
});
},
);
diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb
index 2b9a3fd8091..d3c7fcc465a 100644
--- a/spec/lib/gitlab/git/repository_spec.rb
+++ b/spec/lib/gitlab/git/repository_spec.rb
@@ -2573,6 +2573,12 @@ RSpec.describe Gitlab::Git::Repository, feature_category: :source_code_managemen
end
end
+ describe '#get_patch_id' do
+ it_behaves_like 'wrapping gRPC errors', Gitlab::GitalyClient::CommitService, :get_patch_id do
+ subject { repository.get_patch_id('HEAD~', 'HEAD') }
+ end
+ end
+
def create_remote_branch(remote_name, branch_name, source_branch_name)
source_branch = repository.find_branch(source_branch_name)
repository.write_ref("refs/remotes/#{remote_name}/#{branch_name}", source_branch.dereferenced_target.sha)
diff --git a/spec/lib/gitlab/gitaly_client/commit_service_spec.rb b/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
index 740073d5e4e..2ee9d85c723 100644
--- a/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
+++ b/spec/lib/gitlab/gitaly_client/commit_service_spec.rb
@@ -1108,4 +1108,22 @@ RSpec.describe Gitlab::GitalyClient::CommitService, feature_category: :gitaly do
expect(signatures[large_signed_text][:signed_text].size).to eq(4971878)
end
end
+
+ describe '#get_patch_id' do
+ it 'returns patch_id of given revisions' do
+ expect(client.get_patch_id('HEAD~', 'HEAD')).to eq('45435e5d7b339dd76d939508c7687701d0c17fff')
+ end
+
+ context 'when one of the param is invalid' do
+ it 'raises an GRPC::InvalidArgument error' do
+ expect { client.get_patch_id('HEAD', nil) }.to raise_error(GRPC::InvalidArgument)
+ end
+ end
+
+ context 'when two revisions are the same' do
+ it 'raises an GRPC::FailedPrecondition error' do
+ expect { client.get_patch_id('HEAD', 'HEAD') }.to raise_error(GRPC::FailedPrecondition)
+ end
+ end
+ end
end
diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb
index 54c0c086144..90edbf530cf 100644
--- a/spec/models/ci/build_spec.rb
+++ b/spec/models/ci/build_spec.rb
@@ -5566,4 +5566,26 @@ RSpec.describe Ci::Build, feature_category: :continuous_integration, factory_def
end
end
end
+
+ describe 'routing table switch' do
+ context 'with ff disabled' do
+ before do
+ stub_feature_flags(ci_partitioning_use_ci_builds_routing_table: false)
+ end
+
+ it 'uses the legacy table' do
+ expect(described_class.table_name).to eq('ci_builds')
+ end
+ end
+
+ context 'with ff enabled' do
+ before do
+ stub_feature_flags(ci_partitioning_use_ci_builds_routing_table: true)
+ end
+
+ it 'uses the routing table' do
+ expect(described_class.table_name).to eq('p_ci_builds')
+ end
+ end
+ end
end
diff --git a/spec/models/ci/job_artifact_spec.rb b/spec/models/ci/job_artifact_spec.rb
index 498af80dbb6..83c233fa942 100644
--- a/spec/models/ci/job_artifact_spec.rb
+++ b/spec/models/ci/job_artifact_spec.rb
@@ -824,82 +824,4 @@ RSpec.describe Ci::JobArtifact, feature_category: :build_artifacts do
it { is_expected.to eq(artifact.file.filename) }
end
-
- describe '#to_deleted_object_attrs' do
- let(:pick_up_at) { nil }
- let(:expire_at) { nil }
- let(:file_final_path) { nil }
-
- let(:artifact) do
- create(
- :ci_job_artifact,
- :archive,
- :remote_store,
- file_final_path: file_final_path,
- expire_at: expire_at
- )
- end
-
- subject(:attributes) { artifact.to_deleted_object_attrs(pick_up_at) }
-
- before do
- stub_artifacts_object_storage
- end
-
- shared_examples_for 'returning attributes for object deletion' do
- it 'returns the file store' do
- expect(attributes[:file_store]).to eq(artifact.file_store)
- end
-
- context 'when pick_up_at is present' do
- let(:pick_up_at) { 2.hours.ago }
-
- it 'returns the pick_up_at value' do
- expect(attributes[:pick_up_at]).to eq(pick_up_at)
- end
- end
-
- context 'when pick_up_at is not present' do
- context 'and expire_at is present' do
- let(:expire_at) { 4.hours.ago }
-
- it 'sets expire_at as pick_up_at' do
- expect(attributes[:pick_up_at]).to eq(expire_at)
- end
- end
-
- context 'and expire_at is not present' do
- it 'sets current time as pick_up_at' do
- freeze_time do
- expect(attributes[:pick_up_at]).to eq(Time.current)
- end
- end
- end
- end
- end
-
- context 'when file_final_path is present' do
- let(:file_final_path) { 'some/hash/path/to/randomfile' }
-
- it 'returns the store_dir and file based on the file_final_path' do
- expect(attributes).to include(
- store_dir: 'some/hash/path/to',
- file: 'randomfile'
- )
- end
-
- it_behaves_like 'returning attributes for object deletion'
- end
-
- context 'when file_final_path is not present' do
- it 'returns the uploader default store_dir and file_identifier' do
- expect(attributes).to include(
- store_dir: artifact.file.store_dir.to_s,
- file: artifact.file_identifier
- )
- end
-
- it_behaves_like 'returning attributes for object deletion'
- end
- end
end
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index 50e2ded695c..56e69cc2b9c 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -1968,19 +1968,29 @@ RSpec.describe Ci::Runner, type: :model, feature_category: :runner do
end
describe '.with_upgrade_status' do
- subject { described_class.with_upgrade_status(upgrade_status) }
+ subject(:scope) { described_class.with_upgrade_status(upgrade_status) }
- let_it_be(:runner_14_0_0) { create(:ci_runner, version: '14.0.0') }
- let_it_be(:runner_14_1_0) { create(:ci_runner, version: '14.1.0') }
- let_it_be(:runner_14_1_1) { create(:ci_runner, version: '14.1.1') }
- let_it_be(:runner_version_14_0_0) { create(:ci_runner_version, version: '14.0.0', status: :available) }
- let_it_be(:runner_version_14_1_0) { create(:ci_runner_version, version: '14.1.0', status: :recommended) }
- let_it_be(:runner_version_14_1_1) { create(:ci_runner_version, version: '14.1.1', status: :unavailable) }
+ let_it_be(:runner_14_0_0) { create(:ci_runner) }
+ let_it_be(:runner_14_1_0_and_14_0_0) { create(:ci_runner) }
+ let_it_be(:runner_14_1_0) { create(:ci_runner) }
+ let_it_be(:runner_14_1_1) { create(:ci_runner) }
+
+ before_all do
+ create(:ci_runner_machine, runner: runner_14_1_0_and_14_0_0, version: '14.0.0')
+ create(:ci_runner_machine, runner: runner_14_1_0_and_14_0_0, version: '14.1.0')
+ create(:ci_runner_machine, runner: runner_14_0_0, version: '14.0.0')
+ create(:ci_runner_machine, runner: runner_14_1_0, version: '14.1.0')
+ create(:ci_runner_machine, runner: runner_14_1_1, version: '14.1.1')
+
+ create(:ci_runner_version, version: '14.0.0', status: :available)
+ create(:ci_runner_version, version: '14.1.0', status: :recommended)
+ create(:ci_runner_version, version: '14.1.1', status: :unavailable)
+ end
context ':unavailable' do
let(:upgrade_status) { :unavailable }
- it 'returns runners whose version is assigned :unavailable' do
+ it 'returns runners with runner managers whose version is assigned :unavailable' do
is_expected.to contain_exactly(runner_14_1_1)
end
end
@@ -1988,23 +1998,27 @@ RSpec.describe Ci::Runner, type: :model, feature_category: :runner do
context ':available' do
let(:upgrade_status) { :available }
- it 'returns runners whose version is assigned :available' do
- is_expected.to contain_exactly(runner_14_0_0)
+ it 'returns runners with runner managers whose version is assigned :available' do
+ is_expected.to contain_exactly(runner_14_0_0, runner_14_1_0_and_14_0_0)
end
end
context ':recommended' do
let(:upgrade_status) { :recommended }
- it 'returns runners whose version is assigned :recommended' do
- is_expected.to contain_exactly(runner_14_1_0)
+ it 'returns runners with runner managers whose version is assigned :recommended' do
+ is_expected.to contain_exactly(runner_14_1_0_and_14_0_0, runner_14_1_0)
end
end
describe 'composed with other scopes' do
subject { described_class.active(false).with_upgrade_status(:available) }
- let(:inactive_runner_14_0_0) { create(:ci_runner, version: '14.0.0', active: false) }
+ before do
+ create(:ci_runner_machine, runner: inactive_runner_14_0_0, version: '14.0.0')
+ end
+
+ let(:inactive_runner_14_0_0) { create(:ci_runner, active: false) }
it 'returns runner matching the composed scope' do
is_expected.to contain_exactly(inactive_runner_14_0_0)
diff --git a/spec/models/commit_status_spec.rb b/spec/models/commit_status_spec.rb
index ac356bcd65a..9ce9f0e13b5 100644
--- a/spec/models/commit_status_spec.rb
+++ b/spec/models/commit_status_spec.rb
@@ -1067,4 +1067,26 @@ RSpec.describe CommitStatus, feature_category: :continuous_integration do
it_behaves_like 'having enum with nil value'
end
+
+ describe 'routing table switch' do
+ context 'with ff disabled' do
+ before do
+ stub_feature_flags(ci_partitioning_use_ci_builds_routing_table: false)
+ end
+
+ it 'uses the legacy table' do
+ expect(described_class.table_name).to eq('ci_builds')
+ end
+ end
+
+ context 'with ff enabled' do
+ before do
+ stub_feature_flags(ci_partitioning_use_ci_builds_routing_table: true)
+ end
+
+ it 'uses the routing table' do
+ expect(described_class.table_name).to eq('p_ci_builds')
+ end
+ end
+ end
end
diff --git a/spec/models/concerns/ci/partitionable/switch_spec.rb b/spec/models/concerns/ci/partitionable/switch_spec.rb
index 551ae111fa4..4aaf69bb585 100644
--- a/spec/models/concerns/ci/partitionable/switch_spec.rb
+++ b/spec/models/concerns/ci/partitionable/switch_spec.rb
@@ -38,6 +38,7 @@ RSpec.describe Ci::Partitionable::Switch, :aggregate_failures do
id serial NOT NULL PRIMARY KEY,
job_id int,
partition_id int NOT NULL DEFAULT 1,
+ type text,
expanded_environment_name text);
CREATE TABLE _test_p_ci_jobs_metadata (
@@ -89,6 +90,25 @@ RSpec.describe Ci::Partitionable::Switch, :aggregate_failures do
it { expect(partitioned_model.sequence_name).to eq('_test_ci_jobs_metadata_id_seq') }
+ context 'with singe table inheritance' do
+ let(:child_model) do
+ Class.new(model) do
+ def self.name
+ 'TestSwitchJobMetadataChild'
+ end
+ end
+ end
+
+ it 'adds a Partitioned model for each descendant' do
+ expect(model::Partitioned).not_to eq(child_model::Partitioned)
+ end
+
+ it 'uses the parent name in STI queries' do
+ recorder = ActiveRecord::QueryRecorder.new { child_model.all.load }
+ expect(recorder.log).to include(/"type" = 'TestSwitchJobMetadataChild'/)
+ end
+ end
+
context 'when switching the tables' do
before do
stub_feature_flags(table_rollout_flag => false)
diff --git a/spec/models/concerns/ci/partitionable_spec.rb b/spec/models/concerns/ci/partitionable_spec.rb
index d41654e547e..6daafc78cff 100644
--- a/spec/models/concerns/ci/partitionable_spec.rb
+++ b/spec/models/concerns/ci/partitionable_spec.rb
@@ -25,7 +25,11 @@ RSpec.describe Ci::Partitionable do
end
context 'with through options' do
+ let(:disable_partitionable_switch) { nil }
+
before do
+ stub_env('DISABLE_PARTITIONABLE_SWITCH', disable_partitionable_switch)
+
allow(ActiveSupport::DescendantsTracker).to receive(:store_inherited)
stub_const("#{described_class}::Testing::PARTITIONABLE_MODELS", [ci_model.name])
@@ -39,6 +43,12 @@ RSpec.describe Ci::Partitionable do
it { expect(ci_model.routing_table_name_flag).to eq(:some_flag) }
it { expect(ci_model.ancestors).to include(described_class::Switch) }
+
+ context 'when DISABLE_PARTITIONABLE_SWITCH is set' do
+ let(:disable_partitionable_switch) { true }
+
+ it { expect(ci_model.ancestors).not_to include(described_class::Switch) }
+ end
end
context 'with partitioned options' do
diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb
index 9f9417c2483..72c966f8ca5 100644
--- a/spec/models/repository_spec.rb
+++ b/spec/models/repository_spec.rb
@@ -3804,4 +3804,22 @@ RSpec.describe Repository, feature_category: :source_code_management do
include_examples 'does not delete branch'
end
end
+
+ describe '#get_patch_id' do
+ it 'returns patch_id of given revisions' do
+ expect(repository.get_patch_id('HEAD~', 'HEAD')).to eq('45435e5d7b339dd76d939508c7687701d0c17fff')
+ end
+
+ context 'when one of the param is invalid' do
+ it 'raises an ArgumentError error' do
+ expect { repository.get_patch_id('HEAD', nil) }.to raise_error(ArgumentError)
+ end
+ end
+
+ context 'when two revisions are the same' do
+ it 'raises an Gitlab::Git::CommandError error' do
+ expect { repository.get_patch_id('HEAD', 'HEAD') }.to raise_error(Gitlab::Git::CommandError)
+ end
+ end
+ end
end
diff --git a/spec/requests/api/metrics/user_starred_dashboards_spec.rb b/spec/requests/api/metrics/user_starred_dashboards_spec.rb
index 2ac7d3cffc8..bdeba777350 100644
--- a/spec/requests/api/metrics/user_starred_dashboards_spec.rb
+++ b/spec/requests/api/metrics/user_starred_dashboards_spec.rb
@@ -15,10 +15,6 @@ RSpec.describe API::Metrics::UserStarredDashboards, feature_category: :metrics d
}
end
- before do
- stub_feature_flags(remove_monitor_metrics: false)
- end
-
describe 'POST /projects/:id/metrics/user_starred_dashboards' do
before do
project.add_reporter(user)
@@ -26,13 +22,6 @@ RSpec.describe API::Metrics::UserStarredDashboards, feature_category: :metrics d
context 'with correct permissions' do
context 'with invalid parameters' do
- it 'returns error message' do
- post api(url, user), params: { dashboard_path: '' }
-
- expect(response).to have_gitlab_http_status(:bad_request)
- expect(json_response['error']).to eq('dashboard_path is empty')
- end
-
context 'user is missing' do
it 'returns 404 not found' do
post api(url, nil), params: params
@@ -60,10 +49,6 @@ RSpec.describe API::Metrics::UserStarredDashboards, feature_category: :metrics d
end
context 'when metrics dashboard feature is unavailable' do
- before do
- stub_feature_flags(remove_monitor_metrics: true)
- end
-
it 'returns 404 not found' do
post api(url, user), params: params
@@ -83,44 +68,6 @@ RSpec.describe API::Metrics::UserStarredDashboards, feature_category: :metrics d
end
context 'with correct permissions' do
- context 'with valid parameters' do
- context 'dashboard_path as url param url escaped' do
- it 'deletes given user starred metrics dashboard', :aggregate_failures do
- delete api(url, user), params: params
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['deleted_rows']).to eq(1)
- expect(::Metrics::UsersStarredDashboard.all.pluck(:dashboard_path)).not_to include(dashboard)
- end
- end
-
- context 'dashboard_path in request body unescaped' do
- let(:params) do
- {
- dashboard_path: dashboard
- }
- end
-
- it 'deletes given user starred metrics dashboard', :aggregate_failures do
- delete api(url, user), params: params
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['deleted_rows']).to eq(1)
- expect(::Metrics::UsersStarredDashboard.all.pluck(:dashboard_path)).not_to include(dashboard)
- end
- end
-
- context 'dashboard_path has not been specified' do
- it 'deletes all starred dashboards for that user within given project', :aggregate_failures do
- delete api(url, user), params: {}
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(json_response['deleted_rows']).to eq(2)
- expect(::Metrics::UsersStarredDashboard.all).to contain_exactly(other_user_starred_dashboard, other_project_starred_dashboard)
- end
- end
- end
-
context 'with invalid parameters' do
context 'user is missing' do
it 'returns 404 not found' do
@@ -149,10 +96,6 @@ RSpec.describe API::Metrics::UserStarredDashboards, feature_category: :metrics d
end
context 'when metrics dashboard feature is unavailable' do
- before do
- stub_feature_flags(remove_monitor_metrics: true)
- end
-
it 'returns 404 not found' do
delete api(url, user), params: params
diff --git a/spec/services/ci/delete_objects_service_spec.rb b/spec/services/ci/delete_objects_service_spec.rb
index a64c0fa4076..939b72cef3b 100644
--- a/spec/services/ci/delete_objects_service_spec.rb
+++ b/spec/services/ci/delete_objects_service_spec.rb
@@ -4,203 +4,108 @@ require 'spec_helper'
RSpec.describe Ci::DeleteObjectsService, :aggregate_failures, feature_category: :continuous_integration do
let(:service) { described_class.new }
+ let(:artifact) { create(:ci_job_artifact, :archive) }
let(:data) { [artifact] }
describe '#execute' do
- shared_examples_for 'deleting objects' do |store_type|
- before do
- Ci::DeletedObject.bulk_import(data)
- # We disable the check because the specs are wrapped in a transaction
- allow(service).to receive(:transaction_open?).and_return(false)
- end
+ before do
+ Ci::DeletedObject.bulk_import(data)
+ # We disable the check because the specs are wrapped in a transaction
+ allow(service).to receive(:transaction_open?).and_return(false)
+ end
- subject(:execute) { service.execute }
+ subject(:execute) { service.execute }
- it 'deletes records' do
- expect { execute }.to change { Ci::DeletedObject.count }.by(-1)
- end
+ it 'deletes records' do
+ expect { execute }.to change { Ci::DeletedObject.count }.by(-1)
+ end
- it 'deletes files' do
- if store_type == :object_storage
- expect { execute }
- .to change { fog_connection.directories.get(bucket).files.any? }
- else
- expect { execute }.to change { artifact.file.exists? }
- end
- end
+ it 'deletes files' do
+ expect { execute }.to change { artifact.file.exists? }
+ end
- context 'when trying to execute without records' do
- let(:data) { [] }
+ context 'when trying to execute without records' do
+ let(:data) { [] }
- it 'does not change the number of objects' do
- expect { execute }.not_to change { Ci::DeletedObject.count }
- end
+ it 'does not change the number of objects' do
+ expect { execute }.not_to change { Ci::DeletedObject.count }
end
+ end
- context 'when trying to remove the same file multiple times' do
- let(:objects) { Ci::DeletedObject.all.to_a }
-
- before do
- expect(service).to receive(:load_next_batch).twice.and_return(objects)
- end
+ context 'when trying to remove the same file multiple times' do
+ let(:objects) { Ci::DeletedObject.all.to_a }
- it 'executes successfully' do
- 2.times { expect(service.execute).to be_truthy }
- end
+ before do
+ expect(service).to receive(:load_next_batch).twice.and_return(objects)
end
- context 'with artifacts both ready and not ready for deletion' do
- let(:data) { [] }
-
- let_it_be(:past_ready) { create(:ci_deleted_object, pick_up_at: 2.days.ago) }
- let_it_be(:ready) { create(:ci_deleted_object, pick_up_at: 1.day.ago) }
-
- it 'skips records with pick_up_at in the future' do
- not_ready = create(:ci_deleted_object, pick_up_at: 1.day.from_now)
-
- expect { execute }.to change { Ci::DeletedObject.count }.from(3).to(1)
- expect(not_ready.reload.present?).to be_truthy
- end
-
- it 'limits the number of records removed' do
- stub_const("#{described_class}::BATCH_SIZE", 1)
-
- expect { execute }.to change { Ci::DeletedObject.count }.by(-1)
- end
-
- it 'removes records in order' do
- stub_const("#{described_class}::BATCH_SIZE", 1)
-
- execute
-
- expect { past_ready.reload }.to raise_error(ActiveRecord::RecordNotFound)
- expect(ready.reload.present?).to be_truthy
- end
+ it 'executes successfully' do
+ 2.times { expect(service.execute).to be_truthy }
+ end
+ end
- it 'updates pick_up_at timestamp' do
- allow(service).to receive(:destroy_everything)
+ context 'with artifacts both ready and not ready for deletion' do
+ let(:data) { [] }
- execute
+ let_it_be(:past_ready) { create(:ci_deleted_object, pick_up_at: 2.days.ago) }
+ let_it_be(:ready) { create(:ci_deleted_object, pick_up_at: 1.day.ago) }
- expect(past_ready.reload.pick_up_at).to be_like_time(10.minutes.from_now)
- end
+ it 'skips records with pick_up_at in the future' do
+ not_ready = create(:ci_deleted_object, pick_up_at: 1.day.from_now)
- it 'does not delete objects for which file deletion has failed' do
- expect(past_ready)
- .to receive(:delete_file_from_storage)
- .and_return(false)
+ expect { execute }.to change { Ci::DeletedObject.count }.from(3).to(1)
+ expect(not_ready.reload.present?).to be_truthy
+ end
- expect(service)
- .to receive(:load_next_batch)
- .and_return([past_ready, ready])
+ it 'limits the number of records removed' do
+ stub_const("#{described_class}::BATCH_SIZE", 1)
- expect { execute }.to change { Ci::DeletedObject.count }.from(2).to(1)
- expect(past_ready.reload.present?).to be_truthy
- end
+ expect { execute }.to change { Ci::DeletedObject.count }.by(-1)
end
- context 'with an open database transaction' do
- it 'raises an exception and does not remove records' do
- expect(service).to receive(:transaction_open?).and_return(true)
+ it 'removes records in order' do
+ stub_const("#{described_class}::BATCH_SIZE", 1)
- expect { execute }
- .to raise_error(Ci::DeleteObjectsService::TransactionInProgressError)
- .and change { Ci::DeletedObject.count }.by(0)
- end
+ execute
+
+ expect { past_ready.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ expect(ready.reload.present?).to be_truthy
end
- end
- context 'when local storage is used' do
- let(:artifact) { create(:ci_job_artifact, :archive) }
+ it 'updates pick_up_at timestamp' do
+ allow(service).to receive(:destroy_everything)
- it_behaves_like 'deleting objects', :local_storage
- end
+ execute
- context 'when object storage is used' do
- shared_examples_for 'deleting objects from object storage' do
- let!(:fog_file) do
- fog_connection.directories.new(key: bucket).files.create( # rubocop:disable Rails/SaveBang
- key: fog_file_path,
- body: 'content'
- )
- end
-
- let(:artifact) do
- create(
- :ci_job_artifact,
- :remote_store
- ).tap do |a|
- a.update_column(:file, 'artifacts.zip')
- a.reload
- end
- end
-
- context 'and object was direct uploaded to its final location' do
- let(:upload_path) { 'some/path/to/randomfile' }
-
- before do
- artifact.update_column(:file_final_path, upload_path)
- artifact.reload
- end
-
- it_behaves_like 'deleting objects', :object_storage
- end
-
- context 'and object was not direct uploaded to its final location' do
- let(:upload_path) do
- File.join(
- artifact.file.store_dir.to_s,
- artifact.file_identifier
- )
- end
-
- it_behaves_like 'deleting objects', :object_storage
- end
+ expect(past_ready.reload.pick_up_at).to be_like_time(10.minutes.from_now)
end
- context 'and bucket prefix is not configured' do
- let(:fog_connection) do
- stub_artifacts_object_storage
- end
+ it 'does not delete objects for which file deletion has failed' do
+ expect(past_ready)
+ .to receive(:delete_file_from_storage)
+ .and_return(false)
- let(:bucket) { 'artifacts' }
- let(:fog_file_path) { upload_path }
+ expect(service)
+ .to receive(:load_next_batch)
+ .and_return([past_ready, ready])
- it_behaves_like 'deleting objects from object storage'
+ expect { execute }.to change { Ci::DeletedObject.count }.from(2).to(1)
+ expect(past_ready.reload.present?).to be_truthy
end
+ end
- context 'and bucket prefix is configured' do
- let(:fog_config) do
- Gitlab.config.artifacts.object_store.tap do |config|
- config[:remote_directory] = bucket
- config[:bucket_prefix] = bucket_prefix
- end
- end
-
- let(:fog_connection) do
- stub_object_storage_uploader(
- config: fog_config,
- uploader: JobArtifactUploader
- )
- end
-
- let(:bucket_prefix) { 'my/artifacts' }
- let(:bucket) { 'main-bucket' }
- let(:fog_file_path) { File.join(bucket_prefix, upload_path) }
-
- it_behaves_like 'deleting objects from object storage'
+ context 'with an open database transaction' do
+ it 'raises an exception and does not remove records' do
+ expect(service).to receive(:transaction_open?).and_return(true)
+
+ expect { execute }
+ .to raise_error(Ci::DeleteObjectsService::TransactionInProgressError)
+ .and change { Ci::DeletedObject.count }.by(0)
end
end
end
describe '#remaining_batches_count' do
- let(:artifact) do
- create(
- :ci_job_artifact,
- :archive
- )
- end
-
subject { service.remaining_batches_count(max_batch_count: 3) }
context 'when there is less than one batch size' do
diff --git a/spec/services/metrics/users_starred_dashboards/create_service_spec.rb b/spec/services/metrics/users_starred_dashboards/create_service_spec.rb
deleted file mode 100644
index e08bdca8410..00000000000
--- a/spec/services/metrics/users_starred_dashboards/create_service_spec.rb
+++ /dev/null
@@ -1,73 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Metrics::UsersStarredDashboards::CreateService, feature_category: :metrics do
- let_it_be(:user) { create(:user) }
-
- let(:dashboard_path) { 'config/prometheus/common_metrics.yml' }
- let(:service_instance) { described_class.new(user, project, dashboard_path) }
- let(:project) { create(:project) }
- let(:starred_dashboard_params) do
- {
- user: user,
- project: project,
- dashboard_path: dashboard_path
- }
- end
-
- shared_examples 'prevented starred dashboard creation' do |message|
- it 'returns error response', :aggregate_failures do
- expect(Metrics::UsersStarredDashboard).not_to receive(:new)
-
- response = service_instance.execute
-
- expect(response.status).to be :error
- expect(response.message).to eql message
- end
- end
-
- describe '.execute' do
- context 'with anonymous user' do
- it_behaves_like 'prevented starred dashboard creation', 'You are not authorized to add star to this dashboard'
- end
-
- context 'with reporter user' do
- before do
- project.add_reporter(user)
- end
-
- context 'incorrect dashboard_path' do
- let(:dashboard_path) { 'something_incorrect.yml' }
-
- it_behaves_like 'prevented starred dashboard creation', 'Dashboard with requested path can not be found'
- end
-
- context 'with valid dashboard path' do
- it 'creates starred dashboard and returns success response', :aggregate_failures do
- expect_next_instance_of(Metrics::UsersStarredDashboard, starred_dashboard_params) do |starred_dashboard|
- expect(starred_dashboard).to receive(:save).and_return true
- end
-
- response = service_instance.execute
-
- expect(response.status).to be :success
- end
-
- context 'Metrics::UsersStarredDashboard has validation errors' do
- it 'returns error response', :aggregate_failures do
- expect_next_instance_of(Metrics::UsersStarredDashboard, starred_dashboard_params) do |starred_dashboard|
- expect(starred_dashboard).to receive(:save).and_return(false)
- expect(starred_dashboard).to receive(:errors).and_return(double(messages: { base: ['Model validation error'] }))
- end
-
- response = service_instance.execute
-
- expect(response.status).to be :error
- expect(response.message).to eql(base: ['Model validation error'])
- end
- end
- end
- end
- end
-end
diff --git a/spec/services/metrics/users_starred_dashboards/delete_service_spec.rb b/spec/services/metrics/users_starred_dashboards/delete_service_spec.rb
deleted file mode 100644
index 8c4bcecc239..00000000000
--- a/spec/services/metrics/users_starred_dashboards/delete_service_spec.rb
+++ /dev/null
@@ -1,41 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Metrics::UsersStarredDashboards::DeleteService, feature_category: :metrics do
- subject(:service_instance) { described_class.new(user, project, dashboard_path) }
-
- let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project) }
-
- describe '#execute' do
- let_it_be(:user_starred_dashboard_1) { create(:metrics_users_starred_dashboard, user: user, project: project, dashboard_path: 'dashboard_1') }
- let_it_be(:user_starred_dashboard_2) { create(:metrics_users_starred_dashboard, user: user, project: project) }
- let_it_be(:other_user_starred_dashboard) { create(:metrics_users_starred_dashboard, project: project) }
- let_it_be(:other_project_starred_dashboard) { create(:metrics_users_starred_dashboard, user: user) }
-
- context 'without dashboard_path' do
- let(:dashboard_path) { nil }
-
- it 'does not scope user starred dashboards by dashboard path' do
- result = service_instance.execute
-
- expect(result.success?).to be_truthy
- expect(result.payload[:deleted_rows]).to be(2)
- expect(Metrics::UsersStarredDashboard.all).to contain_exactly(other_user_starred_dashboard, other_project_starred_dashboard)
- end
- end
-
- context 'with dashboard_path' do
- let(:dashboard_path) { 'dashboard_1' }
-
- it 'does scope user starred dashboards by dashboard path' do
- result = service_instance.execute
-
- expect(result.success?).to be_truthy
- expect(result.payload[:deleted_rows]).to be(1)
- expect(Metrics::UsersStarredDashboard.all).to contain_exactly(user_starred_dashboard_2, other_user_starred_dashboard, other_project_starred_dashboard)
- end
- end
- end
-end
diff --git a/spec/support/helpers/models/ci/partitioning_testing/schema_helpers.rb b/spec/support/helpers/models/ci/partitioning_testing/schema_helpers.rb
index df653c853b9..a47aaffdb43 100644
--- a/spec/support/helpers/models/ci/partitioning_testing/schema_helpers.rb
+++ b/spec/support/helpers/models/ci/partitioning_testing/schema_helpers.rb
@@ -6,15 +6,12 @@ module Ci
module_function
def with_routing_tables
- previous_table_name = CommitStatus.table_name
- CommitStatus.table_name = :p_ci_builds
- CommitStatus.descendants.each(&:reset_table_name)
+ # previous_table_name = Model.table_name
+ # Model.table_name = routing_table_name
yield
-
- ensure
- CommitStatus.table_name = previous_table_name
- CommitStatus.descendants.each(&:reset_table_name)
+ # ensure
+ # Model.table_name = previous_table_name
end
def setup(connection: Ci::ApplicationRecord.connection)